CSS модули представляют собой подход к стилизации компонентов, при котором каждый компонент получает локальные, изолированные стили, предотвращая конфликты с глобальными правилами CSS. В контексте Atomico это особенно важно, так как библиотека строится на основе Web Components и Shadow DOM, что позволяет реализовать полный контроль над стилями.
Atomico поддерживает работу с CSS модулями через стандартные средства сборки, такие как Webpack, Vite или Parcel. Файлы CSS необходимо импортировать в компонент, после чего классы автоматически становятся локальными:
import { c, css } from "atomico";
import styles from "./button.module.css";
function Button({ label }) {
return (
<button class={styles.button}>
{label}
</button>
);
}
Button.styles = css`
${styles}
`;
customElements.define("x-button", c(Button));
import styles from "./button.module.css" — импорт CSS
как объекта, где ключи соответствуют именам классов.${styles} в css позволяет интегрировать
локальные стили в Shadow DOM компонента.CSS модули обычно включают:
active, disabled, primary).Пример структуры button.module.css:
.button {
display: inline-flex;
align-items: center;
justify-content: center;
padding: 0.5rem 1rem;
font-size: 1rem;
border: none;
border-radius: 4px;
cursor: pointer;
transition: background-color 0.2s ease;
}
.button.primary {
background-color: #007bff;
color: #fff;
}
.button.disabled {
background-color: #e0e0e0;
color: #888;
cursor: not-allowed;
}
.button — основной класс для всех кнопок..primary и .disabled — модификаторы
состояния.Atomico автоматически создает Shadow DOM для компонентов, что делает использование CSS модулей особенно эффективным. Например:
Button.styles = css`
${styles}
:host {
display: inline-block;
}
`;
:host позволяет стилизовать корневой элемент
компонента.CSS модули отлично работают с динамическим применением классов. В
Atomico это реализуется через условное присвоение
class:
function Button({ primary, disabled }) {
const className = [
styles.button,
primary && styles.primary,
disabled && styles.disabled
].filter(Boolean).join(" ");
return <button class={className}>{primary ? "Primary" : "Default"}</button>;
}
filter(Boolean) удаляет ложные значения.join(" ") формирует строку классов для элемента.CSS модули позволяют использовать переменные для изменения стилей на уровне компонента:
:root {
--button-padding: 0.5rem 1rem;
--button-radius: 4px;
}
.button {
padding: var(--button-padding);
border-radius: var(--button-radius);
}
style на хосте.button, label, icon) и избегать
глобальных имен.css для интеграции со Shadow DOM.CSS модули в Atomico обеспечивают надежный и масштабируемый подход к стилизации компонентов, сочетая локальные классы с преимуществами Shadow DOM и динамического управления состоянием. Это делает разработку интерфейсов более предсказуемой и структурированной.