# Интеграция с SASS фреймворком
# Включение сгенерированных стилей компонентов в режиме разработки
Включение сгенерированных CSS стилей SASS компонентов в режиме разработки осуществляется с помощью пользовательского un-pipe тега в head части HTML страницы:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<un-pipe sass="app, grid, btns"></un-pipe>
</head>
<body>
</body>
</html>
Таким образом, мы связали 3 sass компонента app, grid, btns с нашей страницей, это необходимо для того, чтобы
- автоматически включать сгенерированные css стили компонентов к документу
- создать связь между sass компонентами и html страницей
TIP
С помощью un-pipe тега осуществляется привязка SASS компонентов с HTML страницей. Данная связь необходима для того, чтобы можно было автоматически сгенерировать SASS релиз с необходимым набором компонентов относительно выбранной html страницы.
# Правила sass компонента в style теге
В ungic framework имеется возможность писать SASS правила компонента непосредственно из HTML документа. Подробнее об этом, смотрите в данном разделе.
# Использование SASS в виде данных
SASS framework позволяет экспортировать на лету данные в HTML плагин, эти данные могут быть использованы при сборке HTML шаблонов, подробнее о включении SASS опций в шаблоны.
# Упрощение написания классов и наследование значений аттрибутов родителей (@)
При рекомендуемом подходе создания CSS правил SASS компонентов, селектор для стилей строится относительно имени компонента, пример:
Имеется app sass компонент, со следующими css правилами:
@use ".core" as this;
// Обернули компонент с помощью класса с именем компонента .app
@include this.component {
&-btns {
@include this {
&-btn {
display: inline-flex;
align-items: center;
justify-content: center;
height: this.config(btn-height);
padding: 0 this.prop(padding, left);
&-icon {
display: inline-block;
font-size: this.prop(font-size) * .2;
}
}
}
}
}
Результат в .CSS будет следующим:
.app-btns .app-btn {
display: inline-flex;
align-items: center;
justify-content: center;
height: this.config(btn-height);
padding: 0 this.prop(padding, left);
}
.app-btns .app-btn-icon {
display: inline-block;
font-size: this.prop(font-size) * .2;
}
Разметим с полученный результатом наш HTML компонент:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div class="app">
<div class="app-btns">
<button class="app-btn">
Send
<i class="app-btn-icon" aria-hidden="true"></i>
</button>
</div>
</div>
</body>
</html>
Из примера выше мы видим, что все дочерние html элементы наследуют название класса родительского элемента или имя самого компонента, тоже самое происходит и при написании .css правил без использования SCSS / SASS препроцессора. Для упрощения написания css селекторов, препроцессоры поддерживают вложение правил, что избавляет нас от повторного написания родительских классов, а в HTML плагине был разработан функционал наследования значений аттрибутов родительских элементов, пример:
<!-- Отмечаем имя компонента с помощью атрибута cid -->
<!-- С помощью @ задаем класс компонента (в данном случае @ заменится на имя компонента) -->
<div class="@" cid="app">
<!-- @ - заменится на имя компонента -->
<div class="@-btns">
<!-- @ - заменится на имя компонента -->
<button class="@-btn">
Send
<!-- @1 - заменится на первый класс родительского элемента -->
<i class="@1-icon" aria-hidden="true"></i>
</button>
</div>
</div>
Результат:
<div class="app">
<div class="app-btns">
<button class="app-btn">
Send
<i class="app-btn-icon" aria-hidden="true"></i>
</button>
</div>
</div>
Как это работает:
- Необходимо задать корневому элементу компонента атрибут cid с именем компонента
- Использовать @ символы, для того, чтобы подставить значение из однотипного аттрибута ближайшего родительского элемента
- @ - заменяется на имя ближайшего компонента или на имя аппликации (указывается в аттрибуте main у un-pipe инструмента)
- @\d+ - заменить конкретным по счету значением атрибута (когда значения разделены пробелом, вроде аттрибута class) ближайшего родительского элемента. Число указывает на порядковый номер значения и начинается с 1.
- @@ - заменяется на имя аппликации, в случае если имя не указано,будет вести себя как - @1 (Вернет первое значение однотипного аттрибута ближайшего родителя)
- @{2,} - После двух @ символов, начинается сложение по формуле: от общего кол-ва вместе идущих в ряд @ символов вычитается 2 символа (Sum of @ - 2 = @n), полученное число n - является порядковым номером значения аттрибута, пример: @@@ - тоже самое что и @1, @@@@ = @2
Данный механизм позволяет наследовать значения однотипных аттрибутов ближайших родителей, поддерживаемые аттрибуты:
- span
- id
- for
- cid
- style[sass]
TIP
Используйте обратный слэш \ для экранирования, примеры:
<div cid="app" class="@\@"></div>
<!-- the result will be as follows -->
<div class="appapp"></div>
<!-- or -->
<div cid="app" class="@\1"></div>
<!-- the result will be as follows -->
<div class="app1"></div>
Ещё примеры:
<div id="@" cid="app">
<div id="box">
<div class="@-box" id="@1-cell"></div>
<div class="@-box" id="@-cell"></div>
</div>
</div>
Результат будет следующим:
<div id="app">
<div id="box">
<div class="app-box" id="box-cell"></div>
<div class="app-box" id="app-cell"></div>
</div>
</div>
<div cid="component">
<!-- @ будет заменена именем компонента -->
<div class="@-header"></div>
<!-- возможно вложение-->
<!-- неограниченное кол-во классов -->
<!-- в данном контекста @ - будет иметь ID текущего компонента, а точнее btns -->
<button class="@-btn @-control @-desktop" cid="btns">
<!-- выбор конкретного класса родителя -->
<i class="@2-icon"></i>
</button>
<!-- экранирование -->
<div class="@\2"></div>
<!-- или -->
<div class="@\@"></div>
</div>
Результат будет следующим:
<div>
<div class="component-header"></div>
<button class="btns-btn btns-control btns-desktop">
<i class="btns-control-icon"></i>
</button>
<div class="component2"></div>
<div class="componentcomponent"></div>
</div>
Можно назначить имя основного компонента с помощью main атрибута у un-pipe тега, которое будет использоваться по умолчанию в случае отсутствия предка с cid атрибутом:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<un-pipe sass="app" main="app"></un-pipe>
</head>
<body>
<div class="@"></div>
</body>
</html>