CSS-in-JS представляет собой подход, при котором стили пишутся непосредственно в JavaScript/TypeScript коде компонентов. В SvelteKit этот метод позволяет добиться полной инкапсуляции стилей, динамической генерации классов и тесной интеграции с логикой компонентов. Такой подход особенно актуален при работе с UI-библиотеками, где требуется высокоадаптивная стилизация и возможность менять стили на лету.
SvelteKit по умолчанию поддерживает scoped CSS через
<style> с атрибутом lang="scss" или
обычный CSS внутри компонентов. Однако CSS-in-JS позволяет:
Пример динамических стилей с использованием библиотеки
@stitches/svelte:
import { styled } from '@stitches/svelte';
const Button = styled('button', {
base: {
padding: '0.5rem 1rem',
borderRadius: '4px',
fontWeight: 'bold',
},
variants: {
color: {
primary: { backgroundColor: 'blue', color: 'white' },
secondary: { backgroundColor: 'gray', color: 'black' },
},
size: {
small: { fontSize: '0.8rem', padding: '0.25rem 0.5rem' },
large: { fontSize: '1.2rem', padding: '0.75rem 1.5rem' },
},
},
defaultVariants: {
color: 'primary',
size: 'small',
},
});
CSS-in-JS позволяет изменять стили компонентов на основе пропсов или состояния. В SvelteKit это реализуется через реактивные переменные:
<script>
import { css } from '@emotion/css';
export let isActive = false;
$: buttonClass = css`
padding: 0.5rem 1rem;
border-radius: 4px;
background-color: ${isActive ? 'green' : 'gray'};
color: white;
transition: background-color 0.3s ease;
`;
</script>
<button class={buttonClass}>
{isActive ? 'Активно' : 'Неактивно'}
</button>
Ключевые преимущества такого подхода:
Современные SvelteKit UI-библиотеки, такие как
Svelte Material UI, Flowbite Svelte или
SvelteKit-Stitches, активно используют CSS-in-JS подходы
для:
Пример настройки глобальной темы через Stitches:
import { createStitches } from '@stitches/svelte';
export const { styled, globalCss, theme } = createStitches({
theme: {
colors: {
primary: '#1e40af',
secondary: '#f97316',
},
space: {
sm: '8px',
md: '16px',
lg: '24px',
},
fonts: {
body: 'Roboto, sans-serif',
heading: 'Montserrat, sans-serif',
},
},
});
const GlobalStyles = globalCss({
body: {
margin: 0,
fontFamily: '$body',
backgroundColor: '#f5f5f5',
},
});
GlobalStyles();
Несмотря на гибкость CSS-in-JS, важно учитывать несколько аспектов:
CSS-in-JS в SvelteKit становится мощным инструментом для построения современных интерфейсов, позволяя создавать масштабируемые, динамические и легко кастомизируемые UI-библиотеки.