Atomico предоставляет удобный механизм для работы со стилями в
компонентах, сочетая возможности стандартного CSS и реактивного подхода
к обновлению DOM. Основной инструмент для стилизации — функция
css, которая позволяет создавать изолированные стили для
компонента, обеспечивая инкапсуляцию и предотвращая конфликт с
глобальными стилями.
cssФункция css принимает строку с CSS-кодом и возвращает
объект стиля, который можно использовать внутри компонента. Пример:
import { c, css } from 'atomico';
const style = css`
:host {
display: block;
padding: 16px;
background-color: #f0f0f0;
border-radius: 8px;
font-family: Arial, sans-serif;
}
h1 {
color: #333;
font-size: 24px;
margin: 0;
}
p {
color: #666;
line-height: 1.5;
}
`;
function Card() {
return (
<host shadowDom>
<style>{style}</style>
<h1>Заголовок</h1>
<p>Описание содержимого карточки.</p>
</host>
);
}
export default c(Card);
Ключевые моменты:
:host позволяет стилизовать корневой элемент
компонента.css автоматически инкапсулируются, что
предотвращает их утечку в глобальный scope.:hover,
:focus) и медиа-запросы.Atomico поддерживает реактивные стили, которые зависят от свойств компонента. Для этого используется реактивная функция внутри шаблона:
import { c, useState, css } from 'atomico';
function Button({ primary }) {
const dynamicStyle = css`
:host {
display: inline-block;
padding: 10px 20px;
border-radius: 4px;
background-color: ${primary ? '#007bff' : '#e0e0e0'};
color: ${primary ? '#fff' : '#333'};
cursor: pointer;
transition: background-color 0.3s;
}
:host(:hover) {
background-color: ${primary ? '#0056b3' : '#c0c0c0'};
}
`;
return (
<host shadowDom>
<style>{dynamicStyle}</style>
<slot></slot>
</host>
);
}
export default c(Button);
Особенности:
:host и псевдоклассов позволяет полностью
контролировать внешний вид компонента.По умолчанию стили в Atomico инкапсулированы благодаря Shadow DOM.
Однако можно комбинировать локальные и глобальные стили. Глобальные
стили подключаются через обычные теги <style> вне
Shadow DOM или через импорт CSS-файлов:
import { c } from 'atomico';
import './global.css';
function Layout() {
return (
<host>
<div class="container">
<slot></slot>
</div>
</host>
);
}
export default c(Layout);
Atomico полностью поддерживает CSS-переменные, что позволяет создавать темы и легко менять стили компонентов:
import { c, css } from 'atomico';
const style = css`
:host {
--primary-color: #007bff;
--secondary-color: #6c757d;
display: block;
padding: 12px;
background-color: var(--secondary-color);
color: #fff;
}
button {
background-color: var(--primary-color);
border: none;
color: #fff;
padding: 8px 16px;
border-radius: 4px;
cursor: pointer;
}
`;
function ThemedCard() {
return (
<host shadowDom>
<style>{style}</style>
<button>Нажать</button>
</host>
);
}
export default c(ThemedCard);
Преимущества:
Atomico позволяет создавать переиспользуемые фрагменты CSS, которые можно применять к нескольким компонентам:
const cardMixin = css`
border-radius: 8px;
padding: 16px;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
`;
const style = css`
:host {
${cardMixin};
background-color: #fff;
}
h2 {
margin-top: 0;
}
`;
Особенности:
Atomico не ограничивает использование сторонних CSS-библиотек. Можно импортировать фреймворки и применять их классы внутри компонента. При этом Shadow DOM сохраняет изоляцию для собственных стилей, а глобальные стили фреймворка можно применять через обычные классы.
import 'bootstrap/dist/css/bootstrap.min.css';
import { c } from 'atomico';
function Alert({ type }) {
return (
<host shadowDom>
<div class={`alert alert-${type}`} role="alert">
Важное уведомление!
</div>
</host>
);
}
export default c(Alert);
Особенности интеграции:
CSS-анимации в Atomico полностью поддерживаются и могут быть реактивными:
import { c, css, useState } from 'atomico';
function FadeBox({ visible }) {
const style = css`
:host {
display: block;
width: 100px;
height: 100px;
background-color: #007bff;
opacity: ${visible ? 1 : 0};
transition: opacity 0.5s;
}
`;
return (
<host shadowDom>
<style>{style}</style>
</host>
);
}
export default c(FadeBox);
Ключевые моменты:
Atomico объединяет мощь стандартного CSS и реактивного подхода
JavaScript, обеспечивая гибкую и безопасную систему стилизации
компонентов. Использование css, реактивных переменных,
миксинов и Shadow DOM позволяет создавать визуально богатые,
переиспользуемые и легко поддерживаемые интерфейсы.