0.0.3 • Published 1 year ago

@2gis-kit/css v0.0.3

Weekly downloads
-
License
-
Repository
-
Last release
1 year ago

Kit styles

Библиотека CSS-in-JS основанная на Emotion.

Основные концепции заимствованы из Mantine UI Kit (v6).

Источники кода:

Mantine Styles (v6)

Mantine Server Side (v6)

Mantine Next (v6)

Установка

npm install @2gis-kit/css

Использование

Оберните корневой компонент в KitProvider

import { KitProvider } from '@2gis-kit/css';

function Demo() {
  return (
    <KitProvider>
      <App />
    </KitProvider>
  );
}

Теперь вы можете использовать библиотеку.

Тема

Объект темы содержит различные объекты (цвета, логотипы, шрифты). Для настройки темы вы можете использовать KitProvider:

import { KitProvider } from '@2gis-kit/css';

function Demo() {
  return (
    <KitProvider theme={
      {
        colors: {
          primary: { 
            main: '#19AA1E'
          }
        }
      }
    }>
      <App />
    </KitProvider>
  );
}

Написание стилей

Для созданий стилей используется функция createStyles.

import { createStyles } from '@2gis-kit/css';

const useStyles = createStyles((theme) => ({
  root: {
    display: 'block',
    width: '100px',
    height: '100px',
    backgroundColor: theme.colors.primary.main
  }
}));

function Demo() {
  const { classes } = useStyles();

  return (
    <div className={classes.root}>createStyles demo</div>
  );
}

createStyles

Метод createStyles позволяет создавать таблицы стилей в привычном виде, а также имеет несколько дополнительных функций.

Псевдоклассы

import { createStyles } from '2gis-kit/css';

const useStyles = createStyles((theme) => ({
  button: {
    color: theme.white,
    
    '&:hover': {
      backgroundColor: theme.colors.primary.main,
    },

    '&:not(:first-of-type)': {
      backgroundColor: theme.colors.primary.dark_1,

      // pseudo-classes can be nested
      '&:hover': {
        backgroundColor: theme.colors.primary.dark_2,
      },
    },
  },
}));

function Demo() {
  const { classes } = useStyles();
  return (
    <div>
      <button type="button" className={classes.button}>
        First
      </button>
      <button type="button" className={classes.button}>
        Second
      </button>
      <button type="button" className={classes.button}>
        Third
      </button>
    </div>
  );
}

Параметры

Вторым аргументом createStyles принимает набор произвольных параметров (аналогично React компонента).

interface ButtonProps {
  radius: number;
}

const useStyles = createStyles((theme, { radius }: ButtonProps) => ({
  button: {
    color: theme.white,
    backgroundColor: theme.black,
    borderRadius: radius,
    border: 0,
    cursor: 'pointer',
  },
}));

function Button({ color, radius }: ButtonProps) {
  const { classes } = useStyles({ radius });
  
  return (
    <button type="button" className={classes.button}>
      Button
    </button>
  );
}

function Demo() {
  return (
    <>
      <Button radius={5} />
      <Button radius={50} />
    </>
  );
}

Слитие классов (cx)

Для слития классов в один метод createStyles возвращает метод cx. Важно использовать именно его, чтобы избежать коллизий.

import { useState } from 'react';
import { createStyles } from '@2gis-kit/css';

const useStyles = createStyles((theme) => ({
  button: {
    backgroundColor: theme.white,
  },
  
  active: {
    backgroundColor: theme.black,
  },
}));

function Demo() {
  const [active, setActive] = useState(0);
  const { classes, cx } = useStyles();

  return (
    <div>
      <button
        className={cx(classes.button, { [classes.active]: active === 0 })}
        onClick={() => setActive(0)}
        type="button"
      >
        First
      </button>
      <button
        className={cx(classes.button, { [classes.active]: active === 1 })}
        onClick={() => setActive(1)}
        type="button"
      >
        Second
      </button>
    </div>
  );
}

Концепции без документации

Данные концепции реализованы, но пока не получили документацию. Можно временно использовать - https://v6.mantine.dev/

  • Интеграция с NextJS
  • Работа с RTL
  • Композиция и вложенные селекторы