В этой статье мы расскажем, что такое 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)
 - AndreyMalynov18.10.2021 10:55- Получилось поверхностно. Преимущества использования готовых компонентов очевидны, мне не хватило следующего: - — сравнения трех путей: написания собственной библиотеки, использования готовой, без использования. Включить туда оценку в часах на разработку библиотеки, чтобы взвесить решение написания собственной, продвигаемое в статье. Включить стоимость поддержки, документации. Vuetify сам обновит документацию и перейдет на vue 3, компании же самой придется этим заниматься. По итогу построить график сравнения этих трех путей, который позволит понять сколько компании будет стоить каждый из путей в зависимости от времени и числа проектов. - — отмечая в преимуществах написания собственной, не рассмотрели вариант гибридных решений на основе существующей базы открытого кода, что сейчас повсеместно используется крупными компаниями - — можно было бы привести сравнение существующих библиотек (vuetify, quasar и тд). Их стоимость, документацию, расширяемость - — на чем базируется UI KIT, как вписывается в принципы атомарного дизайна и прочие детали  - KOTELOV Автор18.10.2021 10:58- Спасибо за супер развернутый комментарий и за то что накидали нам идей для будущих статьей, попробуем раскрыть эти вопросы) 
 
 - CrocodileRed19.10.2021 00:01- Ну напридумывали. Свкрхподавляющее большинство интерфейсов можно построить на бесплатных библиотеках, начиная с bootstrap и заканчивая тем же упомянутым vuetify. Речь о компактном коде? Средний разработчик закроет этот вопрос по умолчанию. Ну а цвет кнопок и тень от них, как показывает практика, не показатель крутизны информсистемы. - В общем, нужны более могучие доводы :-)  - KOTELOV Автор19.10.2021 09:45- Можете ли назвать знаменитые удобные сайты или сервисы на готовой библиотеке?)  - CrocodileRed19.10.2021 10:35- У вас речь идёт об информационных системах, о них я и писал. Сайты -- это всего лишь подмножество ИС  - KOTELOV Автор19.10.2021 15:02- Если у вас большая компания с тысячами сотрудников, то лучше с нуля отрисовать дизайн + соответствовать гайдлайнам + писать ui kit конкретно под ваш стек. Но если у вас маленькая ИС и мало пользователей пусть даже внутренних, то мы согласны проще накидать на готовой библиотеке)  - CrocodileRed19.10.2021 15:14- Если говорить о том что проще, то вопрос о какой-то кастомной UI вообще не встаёт. И как необходимость кастома зависит от количества пользователей? Вопрос риторический  - KOTELOV Автор19.10.2021 16:19- Действительно удобные интерфейсы разрабатываются с нуля в зависимости от задач. Поэтому я привел в пример популярные сайты и приложения. Всегда удобнее, когда дизайн разрабатывается с нуля под конкретные задачи, а не пытается подстроится под готовые элементы из библиотек.  - CrocodileRed19.10.2021 16:26- Вы путаете дизайн интерфейсов с дизайном отдельных элементов. Действительно удобный интерфейс можно собрать из стандартных элементов и наоборот, можно создать красивые кастомные элементы и собрать из них плохой интерфейс. Если для вас цвет кнопок и есть дизайн интерфейса, тогда ваша точка зрения, описанная в статье, мне понятна  - KOTELOV Автор19.10.2021 16:47- Цвет кнопок и во vuetify можно выбрать или подогнать самому. Мы про дизайн системы в целом. 
 
 
 
 
 
  - cyber_roach19.10.2021 11:49- Эм... Википедия?) 
 Тут скорее момент, в разрезе каких компаний мы говорим?
 Большие и "знаменитые" - у них и без вашей статьи, думаю, есть люди с пониманием того куда и как нужно двигатся в дизайне UI и зачем.
 А у средненьких и маленьких, коих большинство, потребность в UI ките сводится к всяческим админкам и внутренним решениям. Головной сайт выставленный наружу, как правило один. (те UI кит ему и правда нужен, если сайт большой. Вот прям портал целый, но если это обычная приветсвенная страничка с простым магазином на битриксе, его проще и дешевле написать бех китов с темже результатом для конечного пользователя)- Но вот для всех внутренних решений и админок как раз удобнее готовые наборы и библиотеки, по одной простой причине - поддержка и развитие их сводится к минимуму по затратам. - Свой UI кит надо поддерживать, тестировать, расширять и пополнять каждые 3-5 лет иногда меняя координально, как внешний вид, так и код под требования современных фреймворков. Дорого это.  - KOTELOV Автор19.10.2021 14:59- Вы правы, но маленькие и средние компании чаще используют no code решения, а не идут в разработку. К тому же большие компании занимают большую часть рынка и разрабатывают больше систем, чем средние и маленькие компании. Мы согласны, что если у вас небольшая компания и мало сотрудников, то проще накидать все на ui kit, но если ты многомиллиардная корпорация с тысячами сотрудников, то лучше сделать с нуля удобный интерфейс + по технологиям, которые поддерживаются в вашей фирме. Мы не хейтим готовые киты, но действительно удобные проекты дизайнятся и делаются с нуля) 
 
  - gena_vas02.11.2021 11:01- По поводу bootstrap точно скажу, что эту библиотеку используют как минимум такие компании как Netflix, Broadcom, GitLab, Nasa, Fiverr, Telegram, Microsoft, PayPal. 
 Toyota, Ford, Honda (официальные сайты, не дилеры).
 
 
 - 7Sage24.10.2021 22:49- /** - Обработчик события на клик по мыши для кнопки 
- / onClick?: () => void; 
 - Объясните мне, зачем эти комментарии? Может я перечитал "чистый код", но визуально размазывается фокус и загрязняется код. 
 - Predaytor12.11.2021 12:44- Используете typescript? css-in-js? https://stitches.dev на данный момент лучшее решение, в планах static extraction, пока бандл ~6kb Gzip. 
 
           
 
hardtop
И дальше 121 строка кода. Не кажется ли что это "немного" избыточно?
KOTELOV Автор
У кнопки множество состояний, поэтому много кода, но это позволяет дать юзеру более удобный интерфейс)
hardtop
Множество - это сколько? Учитывая, что поведение всё равно отображается браузером. Да, наверное, есть ещё состояние loading, или кнопка с выбором - но их нет в текущем описании и отображении.
Почему не оставить это всё в классах css?