ui-kit
UI Kit библиотека компонентов на основе Mantine для проектов Localzet. Единая система дизайна и компонентов, собранная из лучших практик проектов.
Установка
Заголовок раздела «Установка»npm install @localzet/ui-kit# илиyarn add @localzet/ui-kit# илиpnpm add @localzet/ui-kitТребования
Заголовок раздела «Требования»- React 18.2.0 или выше
- @mantine/core ^8.3.6
- @mantine/hooks ^8.3.6
Быстрый старт
Заголовок раздела «Быстрый старт»1. Импортируйте стили Mantine
Заголовок раздела «1. Импортируйте стили Mantine»В вашем главном файле приложения (например, main.tsx или App.tsx) импортируйте необходимые стили Mantine:
import '@mantine/core/styles.css'import '@mantine/dates/styles.css'import '@mantine/charts/styles.css'import '@mantine/notifications/styles.css'import '@mantine/nprogress/styles.css'// ... другие стили Mantine, которые вы используете2. Импортируйте глобальные стили UI-Kit
Заголовок раздела «2. Импортируйте глобальные стили UI-Kit»import '@localzet/ui-kit/styles'3. Настройте MantineProvider с темой
Заголовок раздела «3. Настройте MantineProvider с темой»import { MantineProvider } from '@mantine/core'import { theme } from '@localzet/ui-kit'
function App() { return ( <MantineProvider theme={theme} defaultColorScheme="dark"> {/* Ваше приложение */} </MantineProvider> )}Структура
Заголовок раздела «Структура»UI-Kit разделен на несколько категорий:
- Components (
@localzet/ui-kit) - Основные UI компоненты - Layouts (
@localzet/ui-kit) - Компоненты для структуры страниц - Theme (
@localzet/ui-kit/theme) - Тема Mantine
Компоненты
Заголовок раздела «Компоненты»LoadingScreen
Заголовок раздела «LoadingScreen»Компонент для отображения экрана загрузки с прогресс-баром.
import { LoadingScreen } from '@localzet/ui-kit'
function MyComponent() { return ( <LoadingScreen height="100dvh" text="Загрузка..." value={75} /> )}Props:
height?: string- Высота контейнера (по умолчанию:'100dvh')text?: string- Текст для отображенияvalue?: number- Значение прогресса от 0 до 100 (по умолчанию:100)
PageHeader
Заголовок раздела «PageHeader»Компонент заголовка страницы с иконкой, заголовком, описанием и действиями.
import { PageHeader } from '@localzet/ui-kit'import { IconSettings } from '@tabler/icons-react'import { Button } from '@mantine/core'
function MyPage() { return ( <PageHeader icon={<IconSettings />} title="Настройки" description="Управление настройками приложения" actions={ <> <Button variant="light">Сохранить</Button> <Button>Отмена</Button> </> } /> )}Props:
icon: ReactNode- Иконка для отображенияtitle: ReactNode- Заголовокdescription?: string- Описание под заголовкомactions?: ReactNode- Действия (кнопки и т.д.)- Все остальные props передаются в
Cardиз Mantine
CopyableField
Заголовок раздела «CopyableField»Поле ввода с возможностью копирования значения в буфер обмена.
import { CopyableField } from '@localzet/ui-kit'
function MyComponent() { return ( <CopyableField label="API ключ" value="sk-1234567890abcdef" size="md" /> )}Props:
label?: string- Метка поляvalue: number | string- Значение для копированияleftSection?: ReactNode- Левая секция (иконка и т.д.)size?: 'lg' | 'md' | 'sm' | 'xl' | 'xs'- Размер поля
InfoField
Заголовок раздела «InfoField»Компонент для отображения пары “метка-значение”.
import { InfoField } from '@localzet/ui-kit'
function MyComponent() { return ( <InfoField label="Статус" value="Активен" /> )}Props:
label: string- Меткаvalue: ReactNode- Значение (может быть любым React-элементом)
ModalFooter
Заголовок раздела «ModalFooter»Футер для модальных окон с адаптивной версткой.
import { Modal, Button } from '@mantine/core'import { ModalFooter } from '@localzet/ui-kit'
function MyModal() { return ( <Modal opened={opened} onClose={close}> <Modal.Body>Содержимое модалки</Modal.Body> <ModalFooter> <Button variant="light">Отмена</Button> <Button>Сохранить</Button> </ModalFooter> </Modal> )}Props:
children: ReactNode- Содержимое футера (обычно кнопки)
DrawerFooter
Заголовок раздела «DrawerFooter»Футер для Drawer с адаптивной версткой.
import { Drawer, Button } from '@mantine/core'import { DrawerFooter } from '@localzet/ui-kit'
function MyDrawer() { return ( <Drawer opened={opened} onClose={close}> <Drawer.Body>Содержимое drawer</Drawer.Body> <DrawerFooter> <Button variant="light">Отмена</Button> <Button>Сохранить</Button> </DrawerFooter> </Drawer> )}Props:
children: ReactNode- Содержимое футера
StickyHeader
Заголовок раздела «StickyHeader»Липкий заголовок, который остается видимым при прокрутке.
import { StickyHeader } from '@localzet/ui-kit'
function MyComponent() { return ( <StickyHeader offset={10}> <h1>Заголовок</h1> </StickyHeader> )}Props:
offset?: number- Отступ в пикселях для активации (по умолчанию:2)- Все остальные props передаются в
Boxиз Mantine
SettingsCard
Заголовок раздела «SettingsCard»Набор компонентов для создания карточек настроек.
import { SettingsCardContainer, SettingsCardHeader, SettingsCardContent, SettingsCardBottom} from '@localzet/ui-kit'import { IconSettings } from '@tabler/icons-react'import { Button, Switch } from '@mantine/core'
function MySettings() { return ( <SettingsCardContainer> <SettingsCardHeader icon={<IconSettings />} title="Настройки уведомлений" description="Управление уведомлениями" /> <SettingsCardContent> <Switch label="Email уведомления" /> <Switch label="Push уведомления" /> </SettingsCardContent> <SettingsCardBottom> <Button>Сохранить</Button> </SettingsCardBottom> </SettingsCardContainer> )}Компоненты:
SettingsCardContainer- Контейнер карточкиSettingsCardHeader- Заголовок с иконкой и описаниемSettingsCardContent- Основное содержимоеSettingsCardBottom- Нижняя секция с разделителем
Компоненты для работы с таблицами.
import { TableContainer, TableCardTitle } from '@localzet/ui-kit'import { IconTable } from '@tabler/icons-react'import { Button } from '@mantine/core'
function MyTable() { return ( <TableContainer> <TableCardTitle icon={<IconTable />} title="Список пользователей" description="Все пользователи системы" actions={<Button>Добавить</Button>} /> {/* Ваша таблица */} </TableContainer> )}Компоненты:
TableContainer- Контейнер для таблицыTableCardTitle- Заголовок таблицы с иконкой и действиями
UnderlineShape
Заголовок раздела «UnderlineShape»Декоративный SVG-элемент для подчеркивания.
import { UnderlineShape } from '@localzet/ui-kit'
function MyComponent() { return ( <div> <h1>Заголовок</h1> <UnderlineShape size={100} color="cyan" /> </div> )}Props:
size?: number | string- Размер SVG- Все остальные props передаются в
Boxиз Mantine
CheckboxCard
Заголовок раздела «CheckboxCard»Карточка с чекбоксом для выбора опций.
import { CheckboxCard } from '@localzet/ui-kit'
function MyComponent() { return ( <CheckboxCard label="Опция 1" description="Описание опции" checked={isChecked} onChange={(e) => setIsChecked(e.currentTarget.checked)} /> )}Props:
label?: string- Метка карточкиdescription?: string- Описание- Все остальные props передаются в
Checkbox.Cardиз Mantine
CopyableArea
Заголовок раздела «CopyableArea»Текстовая область с возможностью копирования.
import { CopyableArea } from '@localzet/ui-kit'
function MyComponent() { return ( <CopyableArea label="Конфигурация" value="some long text to copy..." /> )}Props:
label?: string- Метка поляvalue: number | string- Значение для копирования
SVG логотип компонент.
import { Logo } from '@localzet/ui-kit'
function MyComponent() { return <Logo size={32} color="cyan" />}Props:
size?: number | string- Размер логотипа- Все остальные props передаются в
Boxиз Mantine
LoaderModal
Заголовок раздела «LoaderModal»Компонент загрузки для модальных окон.
import { LoaderModal } from '@localzet/ui-kit'
function MyModal() { return ( <LoaderModal text="Загрузка данных..." h="80vh" w="100%" /> )}Props:
text?: string- Текст под индикатором загрузки- Все остальные props передаются в
Centerиз Mantine
PopoverWithInfo
Заголовок раздела «PopoverWithInfo»Поповер с информационной иконкой.
import { PopoverWithInfo } from '@localzet/ui-kit'
function MyComponent() { return ( <PopoverWithInfo position="right" text="Дополнительная информация о функции" /> )}Props:
position?: 'bottom' | 'left' | 'right' | 'top'- Позиция поповераtext: ReactNode- Текст для отображения
CreateableTagInput
Заголовок раздела «CreateableTagInput»Поле ввода для создания и выбора тегов.
import { CreateableTagInput } from '@localzet/ui-kit'
function MyComponent() { const [tags, setTags] = useState(['TAG1', 'TAG2']) const [value, setValue] = useState<string | null>(null)
return ( <CreateableTagInput tags={tags} value={value} onChange={setValue} label="Tag" placeholder="EXAMPLE_TAG_1" /> )}Props:
tags: string[]- Список доступных теговvalue: string | null | undefined- Текущее значениеonChange?: (value: string | null) => void- Callback при измененииdefaultValue?: string | null- Значение по умолчаниюlabel?: string- Метка поляdescription?: string- Описаниеplaceholder?: string- Placeholdererror?: string- Ошибка валидацииvalidateTag?: (tag: string) => string | null- Кастомная валидация
MetricCard
Заголовок раздела «MetricCard»Комплексный компонент для отображения метрик с различными вариантами.
import { MetricCard } from '@localzet/ui-kit'import { IconUsers } from '@tabler/icons-react'
function MyComponent() { return ( <MetricCard.Root> <MetricCard.Icon c="cyan"> <IconUsers /> </MetricCard.Icon> <MetricCard.TextMuted>Total Users</MetricCard.TextMuted> <MetricCard.TextEmphasis>1,234</MetricCard.TextEmphasis> <MetricCard.TextTrend value={12}>vs last month</MetricCard.TextTrend> </MetricCard.Root> )}Компоненты:
MetricCard.Root- Корневой контейнерMetricCard.Icon- Иконка с градиентным фономMetricCard.TextMuted- Приглушенный текстMetricCard.TextEmphasis- Акцентный текстMetricCard.TextTrend- Тренд с иконкой и значениемMetricCard.RingProgress- Кольцевой прогрессMetricCard.BarChart- Столбчатая диаграмма
MetricWithTrend
Заголовок раздела «MetricWithTrend»Готовый компонент метрики с трендом.
import { MetricWithTrend } from '@localzet/ui-kit'import { IconUsers } from '@tabler/icons-react'
function MyComponent() { return ( <MetricWithTrend title="Total Users" value="1,234" difference={12} period="vs last month" icon={<IconUsers />} /> )}Props:
title: string- Заголовок метрикиvalue: number | string- Значениеdifference: number | string- Разница (для тренда)period?: string- Период сравненияicon: ReactNode- Иконка
SidebarLogo
Заголовок раздела «SidebarLogo»Логотип для сайдбара с поддержкой кастомного изображения.
import { SidebarLogo } from '@localzet/ui-kit'
function MySidebar() { return ( <SidebarLogo logoUrl="https://example.com/logo.png" fallbackLogo="/logo.svg" onClick={() => navigate('/')} size={30} /> )}Props:
logoUrl?: string- URL кастомного логотипаfallbackLogo?: string- Fallback логотипonClick?: () => void- Обработчик кликаsize?: number | string- Размер логотипа
SidebarTitle
Заголовок раздела «SidebarTitle»Заголовок для сайдбара с поддержкой цветных частей.
import { SidebarTitle } from '@localzet/ui-kit'
function MySidebar() { return ( <SidebarTitle title={[ { text: 'My', color: 'cyan' }, { text: 'App', color: 'white' } ]} /> )}Props:
title?: string | Array<{ text: string; color?: string }>- ЗаголовокdefaultTitle?: Array<{ text: string; color?: string }>- Заголовок по умолчанию
MobileWarningOverlay
Заголовок раздела «MobileWarningOverlay»Модальное окно с предупреждением для мобильных устройств.
import { MobileWarningOverlay } from '@localzet/ui-kit'
function MyApp() { const [opened, setOpened] = useState(true)
return ( <MobileWarningOverlay opened={opened} onClose={() => setOpened(false)} title="Mobile device detected" /> )}Props:
opened: boolean- Открыто ли модальное окноonClose: () => void- Обработчик закрытия- Все тексты настраиваются через props
LandscapeBanner
Заголовок раздела «LandscapeBanner»Баннер для принудительного поворота устройства.
import { LandscapeBanner } from '@localzet/ui-kit'
function MyComponent() { return ( <LandscapeBanner title="Please rotate your device" description="This page works better in landscape orientation." /> )}Props:
title?: string- Заголовокdescription?: string- Описание
LanguagePicker
Заголовок раздела «LanguagePicker»Компонент выбора языка.
import { LanguagePicker } from '@localzet/ui-kit'
function MyHeader() { return ( <LanguagePicker currentLanguage="en" onLanguageChange={(lang) => { // Обработка смены языка console.log(lang) }} /> )}Props:
languages?: Language[]- Список языковcurrentLanguage?: string- Текущий языкonLanguageChange?: (language: string) => void- Callback смены языкаdefaultLanguages?: Language[]- Языки по умолчанию
HeaderControl
Заголовок раздела «HeaderControl»Базовый компонент для кнопок в хедере.
import { HeaderControl } from '@localzet/ui-kit'import { IconSettings } from '@tabler/icons-react'
function MyHeader() { return ( <HeaderControl onClick={() => console.log('clicked')}> <IconSettings /> </HeaderControl> )}Props:
- Все props передаются в
UnstyledButtonиз Mantine
HeaderControls
Заголовок раздела «HeaderControls»Группа контролов для хедера.
import { HeaderControls } from '@localzet/ui-kit'
function MyHeader() { return ( <HeaderControls githubLink="https://github.com/example" stars={1234} telegramLink="https://t.me/example" supportLink="https://example.com/donate" withGithub withTelegram withSupport withLanguage onRefresh={() => window.location.reload()} onLogout={() => console.log('logout')} /> )}Props:
githubLink?: string- Ссылка на GitHubstars?: number- Количество звездisGithubLoading?: boolean- Загрузка звездtelegramLink?: string- Ссылка на TelegramsupportLink?: string- Ссылка на поддержкуwithGithub?: boolean- Показывать GitHub контролwithTelegram?: boolean- Показывать Telegram контролwithSupport?: boolean- Показывать Support контролwithLanguage?: boolean- Показывать Language контролwithRefresh?: boolean- Показывать Refresh контролwithLogout?: boolean- Показывать Logout контролwithVersion?: boolean- Показывать Version контролonRefresh?: () => void- Обработчик обновленияonLogout?: () => void- Обработчик выходаversion?: string- Версия приложенияversionComponent?: ReactNode- Кастомный компонент версииrefreshIcon?: ReactNode- Иконка обновленияlogoutIcon?: ReactNode- Иконка выхода
HelpActionIcon
Заголовок раздела «HelpActionIcon»Иконка помощи с тултипом.
import { HelpActionIcon } from '@localzet/ui-kit'
function MyComponent() { return ( <HelpActionIcon onClick={() => openHelp()} tooltip="Click for help" /> )}Props:
hidden?: boolean- Скрыть иконкуonClick?: () => void- Обработчик кликаtooltip?: string- Текст тултипаsize?: string | number- Размерcolor?: string- Цвет
LoadingProgress
Заголовок раздела «LoadingProgress»Компонент для старта индикатора прогресса навигации.
import { LoadingProgress } from '@localzet/ui-kit'
function MyComponent() { return <LoadingProgress start={true} />}Props:
start?: boolean- Начать прогресс (по умолчанию:true)
TableContent
Заголовок раздела «TableContent»Контент для таблицы в CardSection.
import { TableContent } from '@localzet/ui-kit'
function MyTable() { return ( <TableContent> {/* Ваша таблица */} </TableContent> )}Props:
- Все props передаются в
CardSectionиз Mantine
Layouts
Заголовок раздела «Layouts»Компонент-обертка для страниц приложения.
import { Page } from '@localzet/ui-kit'
function MyPage() { return ( <Page title="Моя страница" appName="Мое приложение" onMount={() => { // Вызывается при монтировании страницы console.log('Страница загружена') }} > <div>Содержимое страницы</div> </Page> )}Props:
title?: string- Заголовок страницы (устанавливается вdocument.title)appName?: string- Название приложения (используется в формате{title} | {appName})meta?: ReactNode- Мета-теги для страницыonMount?: () => void- Callback при монтировании компонента- Все остальные props передаются в
Boxиз Mantine
EmptyPage
Заголовок раздела «EmptyPage»Компонент для пустой страницы.
import { EmptyPage } from '@localzet/ui-kit'import { IconEmpty } from '@tabler/icons-react'import { Button } from '@mantine/core'
function MyEmptyPage() { return ( <EmptyPage icon={<IconEmpty size={48} />} title="Nothing found" description="There are no items to display" action={<Button>Create new</Button>} /> )}Props:
title?: string- Заголовокdescription?: string- Описаниеicon?: ReactNode- Иконкаaction?: ReactNode- Действие (кнопка и т.д.)
Тема UI-Kit включает:
- Цветовая палитра: Темная тема с акцентом на cyan
- Типографика: Montserrat, Vazirmatn, Noto Sans SC, Twemoji Country Flags
- Breakpoints: xs, sm, md, lg, xl, 2xl, 3xl, 4xl
- Компоненты с кастомизацией: Badge, Button, Card, Table, Input, Menu, Tooltip и другие
Использование темы
Заголовок раздела «Использование темы»import { theme } from '@localzet/ui-kit'import { MantineProvider } from '@mantine/core'
function App() { return ( <MantineProvider theme={theme} defaultColorScheme="dark"> {/* Ваше приложение */} </MantineProvider> )}Кастомизация темы
Заголовок раздела «Кастомизация темы»Вы можете расширить тему, используя createTheme из Mantine:
import { createTheme, mergeMantineTheme } from '@mantine/core'import { theme as uiKitTheme } from '@localzet/ui-kit'
const customTheme = createTheme({ // Ваши кастомизации})
const finalTheme = mergeMantineTheme(uiKitTheme, customTheme)Overrides компонентов
Заголовок раздела «Overrides компонентов»UI-Kit включает кастомизированные версии следующих компонентов Mantine:
- Badge - с радиусом
mdи вариантомoutline - Button - с радиусом
md, вариантомlightи плавными переходами - Card - с градиентным фоном и анимацией появления
- Table - с подсветкой при наведении
- Input - все инпуты с радиусом
md - Menu - с кастомными стилями для темной темы
- Tooltip - с анимацией и стрелкой
- Notification - с радиусом
md - И другие…
Все эти кастомизации применяются автоматически при использовании темы.
Глобальные стили включают:
- Поддержку safe-area для мобильных устройств
- Стили для таблиц (mantine-datatable)
- Стили для Monaco Editor
- Анимации
- Кастомные стили для компонентов Mantine
Структура проекта
Заголовок раздела «Структура проекта»Разработка
Заголовок раздела «Разработка»Установка зависимостей
Заголовок раздела «Установка зависимостей»npm installnpm run buildПроверка типов
Заголовок раздела «Проверка типов»npm run typecheckРежим разработки (watch)
Заголовок раздела «Режим разработки (watch)»npm run devИсходный код · GPL-3.0