Реалізація CSS-in-JS рішення для компонентів

Наша компанія займається розробкою, підтримкою та обслуговуванням сайтів будь-якої складності. Від простих односторінкових сайтів до масштабних кластерних систем, побудованих на мікро сервісах. Досвід розробників підтверджено сертифікатами від вендорів.

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Пропоновані послуги
Показано 1 з 1 послугУсі 2065 послуг
Реалізація CSS-in-JS рішення для компонентів
Середня
~3-5 робочих днів
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    874
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851

CSS-in-JS рішення для компонентів

CSS-in-JS — підхід, при якому стилі визначаються прямо в JavaScript/TypeScript коді компонента. Стилі ізольовані, типізовані, можуть використовувати props та змінні без CSS-змінних. Компромісс: або runtime-витрати (styled-components, Emotion), або необхідність налаштування збірки (vanilla-extract, Linaria).

Вибір бібліотеки

Бібліотека Runtime SSR Bundle Коли вибирати
Emotion Так Так ~8KB React-проекти, потрібна динаміка
styled-components Так Так ~13KB Класика, велика екосистема
vanilla-extract Ні Так 0 Статичні стилі, максимум продуктивності
Linaria Ні Так 0 Babel/Vite, статика з інтерполяцією
Panda CSS Ні Так 0 Atomic, design tokens, сучасний

Для нового React-проекту — vanilla-extract (zero-runtime) або Emotion (якщо потрібні динамічні стилі через props).

Emotion: базова налаштування

npm install @emotion/react @emotion/styled
npm install -D @emotion/babel-plugin  # для оптимізації
// vite.config.ts
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'

export default defineConfig({
  plugins: [
    react({
      babel: {
        plugins: ['@emotion/babel-plugin'],
      },
    }),
  ],
})

Styled компоненти з Emotion

import styled from '@emotion/styled'
import { css } from '@emotion/react'

const Button = styled.button<{
  variant?: 'primary' | 'secondary'
  size?: 'sm' | 'md' | 'lg'
}>`
  display: inline-flex;
  align-items: center;
  gap: 8px;
  border-radius: 8px;
  font-weight: 500;
  cursor: pointer;
  transition: background-color 150ms ease;

  ${({ size = 'md' }) =>
    ({
      sm: css`padding: 6px 12px; font-size: 13px;`,
      md: css`padding: 10px 20px; font-size: 14px;`,
      lg: css`padding: 14px 28px; font-size: 16px;`,
    }[size])}

  ${({ variant = 'primary' }) =>
    ({
      primary: css`
        background: #2563eb;
        color: white;
        &:hover { background: #1d4ed8; }
      `,
      secondary: css`
        background: transparent;
        color: #2563eb;
        border: 2px solid #2563eb;
      `,
    }[variant])}
`

css prop

import { css } from '@emotion/react'

function Card({ featured }: { featured?: boolean }) {
  return (
    <div
      css={css`
        padding: 16px;
        border-radius: 8px;
        background: ${featured ? '#eff6ff' : '#ffffff'};
        border: 1px solid ${featured ? '#3b82f6' : '#e2e8f0'};
      `}
    >
      Card content
    </div>
  )
}

Zero-runtime з vanilla-extract

// button.css.ts
import { style } from '@vanilla-extract/css'

export const button = style({
  display: 'inline-flex',
  alignItems: 'center',
  gap: 8,
  borderRadius: 8,
  padding: '10px 20px',
  fontWeight: 500,
  cursor: 'pointer',
  background: '#2563eb',
  color: 'white',
  selectors: {
    '&:hover': { background: '#1d4ed8' },
    '&:disabled': { opacity: 0.5, cursor: 'not-allowed' },
  },
})