В этой статье мы расскажем, что такое UI KIT, для чего он нужен, и как он сэкономит время и деньги.

В статье мы подойдем к китам, которые сделаны не только дизайнерами, но также переведены в компоненты фронтенд-разработчиками.

Что такое UI KIT?

Это единый набор элементов пользовательского интерфейса. Выглядят они примерно так:

Для чего он нужен?

1. Единый стиль всех проектов

Все ваши информационные системы будут идентичными. Клиенты будут узнавать вашу компанию по одинаковым элементам. Также им будет удобнее работать с каждым вашим новым продуктом, так как им будут знакомы все элементы и их поведение.

Начало проекта всегда подразумевает создание первых базовых элементов ui-kita на основе утвержденного концепта.

Основная причина — это унификация элементов интерфейса, что сокращает и упрощает работу в дальнейшем в сложных проектах, чтобы избежать ошибок в дальнейшем. И помогает скоординировать работу с разработчиками, чтобы получить дизайн единообразным на разных страницах одного проекта.

К счастью для нас прошло времена Photoshop и на рынке появилась для бога избранных Sketch (маководы ликуют), а уж позже Figma. Что в разы упростило работу для дизайнера. Всеми любимые компоненты позволили делать изменения в разы быстрее, буквально в один клик, что позволяет не бегать по всем экранам и не проверять, где там цвет поменялся, а где нет.

Андрей Залетов

Senior UI/UX designer KOTELOV

2. Экономия на разработке

Если нет кита, компании, нанимая подрядчика заполняют бриф, далее подрядчик разрабатывает с нуля дизайн, далее создает компоненты на фреймворках JavaScript (Angular, React, Vue). То есть заказчик каждый раз платит за дизайн и программирование одних и тех же элементов на фронтенде разным подрядчикам, причем элементы получаются у всех разные по дизайну и коду, что не позволяет масштабироваться. В случае с китом вы платите 1 раз.

3. Мгновенный доступ к UI KIT у всей команды

Аналитики, дизайнеры, разработчики имеют доступ к киту по ссылке. Могут самостоятельно ознакомиться со всеми элементами, правилами их использования и создавать прототипы, фронтенд и дизайн.

4. Скорость разработки

При готовом UI KIT вы имеете все элементы, такие как кнопки, поля ввода, таблицы, графики уже задизайнены и переведены в компоненты (на JS). Вы можете собирать системы, не тратя время на дизайн и разработку. Также упрощается прототипирование, если раньше вы составляли прототипы из простых форм, то сейчас можете собирать их из настоящего дизайна.

Почему важно делать UI KIT, если кнопку или поле можно отрисовать и запрограммировать достаточно быстро?

Большинству пользователей кнопка представляется, как всего лишь прямоугольник с текстом посередине:

Вот так выглядит код кнопки на React:

// Core
import * as React from "react";

// Styles
import styles from "./BadButton.module.scss";

interface BadButtonProps {
  children: React.ReactNode;
  background?: string;
  color?: string;
}

const BadButton: React.FC<BadButtonProps> = (props) => (
  <button
    className={styles.button}
    style={{
      background: props.background || "#5199FF",
      color: props.color || "white"
    }}
    {...props}
  >
    {props.children}
  </button>
);

// Exports
export default BadButton;

А вот так выглядит удобная кнопка, которая делает взаимодействие с системой удобной:

Так выглядит код кнопки здорового человека:

// Core
import * as React from "react";
import classNames from "classnames";

// Utils
import { capitalize } from "./utils/string";

// Styles
import styles from "./GoodButton.module.scss";

const ButtonVariantTypes = ["filled", "outlined", "link"] as const;
const ButtonColorTypes = ["primary", "secondary"] as const;
const ButtonSizeTypes = ["small", "medium", "large"] as const;
const ButtonHTMLTypes = ["submit", "button", "reset"] as const;

export type ButtonVariantType = typeof ButtonVariantTypes[number];
export type ButtonColorType = typeof ButtonColorTypes[number];
export type ButtonSizeType = typeof ButtonSizeTypes[number];
export type ButtonHTMLType = typeof ButtonHTMLTypes[number];

export interface BaseButtonProps {
  /**
   * Передать дочерний элемент для кнопки
   */
  children: React.ReactNode;
  /**
   * Определить класс для кнопки
   */
  className?: string;
  /**
   * Выбрать вариацию отображения кнопки
   */
  variant?: ButtonVariantType;
  /**
   * Выбрать цвет кнопки
   */
  color?: ButtonColorType;
  /**
   * Выбрать размер кнопки
   */
  size?: ButtonSizeType;
  /**
   * Определить размер кнопки во всю ширину от родительского контейнера
   */
  fullWidth?: boolean;
  /**
   * Отключить кнопку
   */
  disabled?: boolean;
  /**
   * Обработчик события на клик по мыши для кнопки
   */
  onClick?: () => void;
}

export type AnchorButtonProps = {
  /**
   * Передать url и определить кнопку как ссылку
   */
  href: string;
} & BaseButtonProps &
  Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, "type" | "onClick">;

export type NativeButtonProps = {
  /**
   * Выбрать тип кнопки
   */
  type?: ButtonHTMLType;
} & BaseButtonProps &
  Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, "type" | "onClick">;

export type ButtonProps = Partial<AnchorButtonProps & NativeButtonProps>;

const GoodButton: React.FC<ButtonProps> = ({
  children,
  className,
  variant = "filled",
  color = "primary",
  size = "small",
  type = "button",
  fullWidth,
  disabled,
  onClick,
  href,
  ...rest
}) => {
  const Component = href ? "a" : "button";

  let buttonProps;

  if (Component === "a") {
    buttonProps = { "aria-disabled": disabled };
  } else {
    buttonProps = { type, disabled };
  }

  return (
    <Component
      {...rest}
      {...buttonProps}
      className={classNames(
        styles.root,
        styles[variant],
        styles[size],
        {
          [styles[`${variant}Color${capitalize(color)}`]]: color,
          [styles[`${variant}Size${capitalize(size)}`]]: size,
          [styles.disabled]: disabled,
          [styles.fullWidth]: fullWidth
        },
        className
      )}
      onClick={onClick}
    >
      {children}
    </Component>
  );
};

// Exports
export default GoodButton;

То есть разработка любого на первый взгляд простого элемента это продолжительная и дорогостоящая работа (если делать его удобным и масштабируемым), поэтому проще один раз отрисовать и запрограммировать каждый элемент и потом использовать его во всех проектах.

Можно ли использовать готовый UI KIT?

В интернете множество китов за небольшие деньги, что-то около 15$. Вы безусловно можете их использовать. Но они скорее подойдут для небольших проектов, которые не собираются далеко масштабироваться или же в вашей компании предполагается сделать одну систему, а не строить множество продуктов.

Основные причины для постройки, а не покупки UI KIT

1. Большие компании приводят все системы к единому виду, чтобы сотрудники и пользователи ориентировались легко в любой системе компании;

2. Компаниям необходимо соблюдать фирменный стиль;

3. При покупке UI KIT вам необходимо отталкиваться от технологий заложенных в купленном ките;

4. Купленный кит не может закрыть весь функционал систем, то есть вам необходимо будет дорисовывать его и дорабатывать;

5. Строя ui kit с нуля вы видите полноценно цель разработки. То есть сможете разрабатывать элементы исходя из задачи, делая каждый элемент удобнее.

Требования к разработчику UI KIT:

UI KIT разрабатывается только дизайнером и разработчиком уровня Senior, которые имеют опыт в подобных проектах. Дизайнер и фронтенд-разработчик должен обладать опытом и знаниями для построения сложных систем, так как ui kit будет использоваться около 5 лет всеми командами разработки вашей компании и привлекаемыми подрядчиками для большинства ваших систем.

Комментарии (18)


  1. hardtop
    18.10.2021 09:42
    +1

    Так выглядит код кнопки здорового человека:

    И дальше 121 строка кода. Не кажется ли что это "немного" избыточно?


    1. KOTELOV Автор
      18.10.2021 11:08

      У кнопки множество состояний, поэтому много кода, но это позволяет дать юзеру более удобный интерфейс)


      1. hardtop
        18.10.2021 14:20

        Множество - это сколько? Учитывая, что поведение всё равно отображается браузером. Да, наверное, есть ещё состояние loading, или кнопка с выбором - но их нет в текущем описании и отображении.

        Почему не оставить это всё в классах css?


  1. AndreyMalynov
    18.10.2021 10:55

    Получилось поверхностно. Преимущества использования готовых компонентов очевидны, мне не хватило следующего:

    — сравнения трех путей: написания собственной библиотеки, использования готовой, без использования. Включить туда оценку в часах на разработку библиотеки, чтобы взвесить решение написания собственной, продвигаемое в статье. Включить стоимость поддержки, документации. Vuetify сам обновит документацию и перейдет на vue 3, компании же самой придется этим заниматься. По итогу построить график сравнения этих трех путей, который позволит понять сколько компании будет стоить каждый из путей в зависимости от времени и числа проектов.

    — отмечая в преимуществах написания собственной, не рассмотрели вариант гибридных решений на основе существующей базы открытого кода, что сейчас повсеместно используется крупными компаниями

    — можно было бы привести сравнение существующих библиотек (vuetify, quasar и тд). Их стоимость, документацию, расширяемость

    — на чем базируется UI KIT, как вписывается в принципы атомарного дизайна и прочие детали


    1. KOTELOV Автор
      18.10.2021 10:58

      Спасибо за супер развернутый комментарий и за то что накидали нам идей для будущих статьей, попробуем раскрыть эти вопросы)


  1. CrocodileRed
    19.10.2021 00:01

    Ну напридумывали. Свкрхподавляющее большинство интерфейсов можно построить на бесплатных библиотеках, начиная с bootstrap и заканчивая тем же упомянутым vuetify. Речь о компактном коде? Средний разработчик закроет этот вопрос по умолчанию. Ну а цвет кнопок и тень от них, как показывает практика, не показатель крутизны информсистемы.

    В общем, нужны более могучие доводы :-)


    1. KOTELOV Автор
      19.10.2021 09:45

      Можете ли назвать знаменитые удобные сайты или сервисы на готовой библиотеке?)


      1. CrocodileRed
        19.10.2021 10:35

        У вас речь идёт об информационных системах, о них я и писал. Сайты -- это всего лишь подмножество ИС


        1. KOTELOV Автор
          19.10.2021 15:02

          Если у вас большая компания с тысячами сотрудников, то лучше с нуля отрисовать дизайн + соответствовать гайдлайнам + писать ui kit конкретно под ваш стек. Но если у вас маленькая ИС и мало пользователей пусть даже внутренних, то мы согласны проще накидать на готовой библиотеке)


          1. CrocodileRed
            19.10.2021 15:14

            Если говорить о том что проще, то вопрос о какой-то кастомной UI вообще не встаёт. И как необходимость кастома зависит от количества пользователей? Вопрос риторический


            1. KOTELOV Автор
              19.10.2021 16:19

              Действительно удобные интерфейсы разрабатываются с нуля в зависимости от задач. Поэтому я привел в пример популярные сайты и приложения. Всегда удобнее, когда дизайн разрабатывается с нуля под конкретные задачи, а не пытается подстроится под готовые элементы из библиотек.


              1. CrocodileRed
                19.10.2021 16:26

                Вы путаете дизайн интерфейсов с дизайном отдельных элементов. Действительно удобный интерфейс можно собрать из стандартных элементов и наоборот, можно создать красивые кастомные элементы и собрать из них плохой интерфейс. Если для вас цвет кнопок и есть дизайн интерфейса, тогда ваша точка зрения, описанная в статье, мне понятна


                1. KOTELOV Автор
                  19.10.2021 16:47

                  Цвет кнопок и во vuetify можно выбрать или подогнать самому. Мы про дизайн системы в целом.


      1. cyber_roach
        19.10.2021 11:49

        Эм... Википедия?)
        Тут скорее момент, в разрезе каких компаний мы говорим?
        Большие и "знаменитые" - у них и без вашей статьи, думаю, есть люди с пониманием того куда и как нужно двигатся в дизайне UI и зачем.
        А у средненьких и маленьких, коих большинство, потребность в UI ките сводится к всяческим админкам и внутренним решениям. Головной сайт выставленный наружу, как правило один. (те UI кит ему и правда нужен, если сайт большой. Вот прям портал целый, но если это обычная приветсвенная страничка с простым магазином на битриксе, его проще и дешевле написать бех китов с темже результатом для конечного пользователя)

        Но вот для всех внутренних решений и админок как раз удобнее готовые наборы и библиотеки, по одной простой причине - поддержка и развитие их сводится к минимуму по затратам.

        Свой UI кит надо поддерживать, тестировать, расширять и пополнять каждые 3-5 лет иногда меняя координально, как внешний вид, так и код под требования современных фреймворков. Дорого это.


        1. KOTELOV Автор
          19.10.2021 14:59

          Вы правы, но маленькие и средние компании чаще используют no code решения, а не идут в разработку. К тому же большие компании занимают большую часть рынка и разрабатывают больше систем, чем средние и маленькие компании. Мы согласны, что если у вас небольшая компания и мало сотрудников, то проще накидать все на ui kit, но если ты многомиллиардная корпорация с тысячами сотрудников, то лучше сделать с нуля удобный интерфейс + по технологиям, которые поддерживаются в вашей фирме. Мы не хейтим готовые киты, но действительно удобные проекты дизайнятся и делаются с нуля)


      1. gena_vas
        02.11.2021 11:01

        По поводу bootstrap точно скажу, что эту библиотеку используют как минимум такие компании как Netflix, Broadcom, GitLab, Nasa, Fiverr, Telegram, Microsoft, PayPal.
        Toyota, Ford, Honda (официальные сайты, не дилеры).


  1. 7Sage
    24.10.2021 22:49

    /**

    • Обработчик события на клик по мыши для кнопки

    • / onClick?: () => void;

    Объясните мне, зачем эти комментарии? Может я перечитал "чистый код", но визуально размазывается фокус и загрязняется код.


  1. Predaytor
    12.11.2021 12:44

    Используете typescript? css-in-js? https://stitches.dev на данный момент лучшее решение, в планах static extraction, пока бандл ~6kb Gzip.