# @tnsu/ui-kit Общие UI-компоненты для SPFx web part'ов ТНСУ. Единый дизайн, один источник правды. > Внутренняя память проекта (решения, план, прогресс) — в [PROJECT.md](./PROJECT.md). ## Установка в проект Пакет лежит в реестре организации **tansu** на git.tnsu.kz. Реестр публичный, а сам git.tnsu.kz доступен только из внутренней сети, поэтому **токен для установки не нужен** (из сети или по VPN). В корне проекта — файл `.npmrc` со строкой: ``` @tnsu:registry=https://git.tnsu.kz/api/packages/tansu/npm/ ``` Затем: ```powershell npm i @tnsu/ui-kit ``` Пакет требует, чтобы в проекте уже были (peerDependencies): `react@17`, `react-dom@17`, `@fluentui/react@8`, `tslib`. У любого SPFx-решения этого поколения они есть. ## Использование ```ts import { Button } from '@tnsu/ui-kit'; import '@tnsu/ui-kit/styles.css'; // один раз в корневом компоненте web part ; ``` ## Компоненты _Наполняется по мере переноса. Полная витрина со всеми состояниями — в Storybook._ **Кнопки:** `Button`, `PrintButton` **Сообщения:** `Alert`, `RequestNumber` **Форма (оболочка/раскладка):** `FormCard`, `FormGrid`, `FormField`, `FormActions`, `CollapseSection` **Поля ввода:** `TextInput`, `TextArea`, `PhoneInput`, `MoneyInput`, `Select`, `Toggle` **Режим чтения:** `FormModeProvider`, `useFormReadOnly` **Иконки:** `Icon`, `IconSprite` **Файлы:** `FileDropzone`, `AttachmentList` **Модалка:** `ConfirmHost`, `confirmModal` **Хуки:** `useFlipRows` > ⏳ В планах: `DataTable` (обобщение ItemsTable), `Badge`, `ErrorOverlay`, навигация (Tabs/Sidebar/Breadcrumbs). ## Разработка пакета ```powershell npm i # поставить зависимости npm run build # собрать пакет в dist/ npm run dev # сборка в watch-режиме npm run storybook # витрина компонентов (localhost:6006) ``` ### Публикация новой версии Публикует пайплайн **publish** в Gitea — по кнопке: Actions → publish → Run workflow. Сначала юнит-тесты и сборка, потом публикация в реестр tansu. - **Версию поднимает пайплайн.** В `package.json` задаются только major.minor (патч там не важен): новая функциональность — поднять minor руками (`0.14.x` → `0.15.0`). Патч — следующий после самого большого опубликованного с тем же major.minor. В git ничего не коммитится. - **Тот же код не публикуется.** Пайплайн считает хэш исходников (`src` без тестов и историй Storybook, `package.json`, конфиги сборки, README), кладёт его в публикуемый `package.json` (поле `sourceHash`) и сравнивает с последней опубликованной версией. Совпало — пайплайн падает с «Публиковать нечего». - Секрет: `PACKAGES_TOKEN` — токен Gitea со scope `write:package` (владелец — участник организации tansu с правом записи). Логин не нужен. Пробный прогон без публикации: `DRY_RUN=1 bash ci/publish.sh`. Версии до 0.14.0 скопированы из прежнего реестра `timur.gorodetskiy` без хэша, поэтому первая публикация пайплайном выпустит `0.14.1` даже без изменений кода; дальше проверка работает как обычно. На каждый push и pull request пайплайн **test** гоняет юнит-тесты и сборку.