@tk-kit/design-system 0.1.17 → 0.1.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,175 @@
1
+ # @tk-kit/design-system
2
+
3
+ Дизайн-система проектов tk-kit: переиспользуемые UI-компоненты, хуки и утилиты, опубликованные как публичный npm-пакет на npmjs.com, Storybook для разработки и просмотра компонентов.
4
+
5
+ ---
6
+
7
+
8
+ ### Стек
9
+
10
+ TypeScript, React 19, Vite, Tailwind CSS v4, shadcn/ui (Radix UI), Storybook, опубликовано на npmjs.com.
11
+
12
+ ### Установка зависимостей
13
+
14
+ ```bash
15
+ pnpm install
16
+ ```
17
+
18
+ При первом запуске может потребоваться подтвердить выполнение build-скриптов нативных зависимостей — это уже настроено в `pnpm-workspace.yaml` (`allowBuilds`), повторно подтверждать не нужно.
19
+
20
+ ### Структура проекта
21
+
22
+ ```
23
+ design-system/
24
+ ├── src/
25
+ │ ├── components/
26
+ │ │ ├── base/ # базовые UI-компоненты (Button, Input, Dialog...)
27
+ │ │ ├── form/ # компоненты для форм (TextField, FileUploadField...)
28
+ │ │ └── icons/ # иконки (генерируются автоматически, см. ниже)
29
+ │ ├── hooks/ # переиспользуемые хуки
30
+ │ ├── lib/ # утилиты, zod-схемы
31
+ │ ├── styles/ # глобальные стили, токены, переменные Tailwind
32
+ │ └── index.ts # публичная точка входа пакета — единственное
33
+ │ # место, откуда что-либо доступно потребителям
34
+ ├── scripts/
35
+ │ └── generate-icons-index.ts # автогенерация index.ts для папки icons
36
+ ├── .storybook/ # конфигурация Storybook
37
+ ├── vite.config.ts # конфиг для Storybook/Vitest
38
+ ├── vite.config.lib.ts # конфиг для сборки библиотеки (lib mode)
39
+ └── pnpm-workspace.yaml # разрешённые build-скрипты зависимостей
40
+ ```
41
+
42
+ ### Как добавить новый компонент
43
+
44
+ 1. Создай папку компонента внутри `src/components/base/` (или `src/components/form/`, если это поле формы):
45
+ ```
46
+ src/components/base/my-component/
47
+ ├── my-component.tsx
48
+ ├── my-component.variants.ts # если используется cva
49
+ ├── my-component.stories.tsx
50
+ └── index.ts
51
+ ```
52
+
53
+ 2. В `index.ts` папки компонента — именованный реэкспорт:
54
+ ```ts
55
+ export { MyComponent } from './my-component'
56
+ export type { MyComponentProps } from './my-component'
57
+ ```
58
+
59
+ 3. Добавь экспорт в **публичный** `src/index.ts` — без этого шага компонент не попадёт в собранный пакет и будет недоступен в приложениях-потребителях:
60
+ ```ts
61
+ export { MyComponent, type MyComponentProps } from '@/components/base/my-component'
62
+ ```
63
+
64
+ 4. Напиши историю в `my-component.stories.tsx`, чтобы компонент был виден в Storybook со всеми вариантами (`variant`, `size`, `disabled` и т.д.).
65
+
66
+ 5. Проверь визуально через Storybook (см. ниже), при необходимости — через `pnpm link` в тестовом приложении.
67
+
68
+ ### Как добавить иконку
69
+
70
+ 1. Положи `.tsx`-файл иконки в `src/components/icons/`, имя файла в формате `kebab-case`, суффикс `-icon` (например `arrow-up-icon.tsx`).
71
+ 2. Запусти автогенерацию реэкспортов:
72
+ ```bash
73
+ pnpm generate:icons
74
+ ```
75
+ Скрипт сам пересоберёт `src/components/icons/index.ts` со всеми иконками из папки. Файл генерируемый — руками не редактируется, перезапишется при следующей сборке.
76
+
77
+ Запускается автоматически при `pnpm build`, отдельный запуск нужен только если хочешь сразу увидеть иконку в Storybook без полного билда.
78
+
79
+ ### Важные принципы дизайн-системы
80
+
81
+ - Дизайн-система **не должна** напрямую зависеть от инфраструктуры конкретного приложения (роутер, стейт-менеджер, HTTP-клиент). Если компоненту нужен роутинг — используется паттерн инверсии через проп `as` (см. компонент `Link`), а не прямой импорт `react-router-dom`.
82
+ - Библиотеки форматирования/работы с данными без привязки к окружению (`date-fns`, `react-number-format`, `react-dropzone` и т.п.) — можно использовать напрямую как обычные зависимости.
83
+ - Любой новый компонент обязан иметь `.stories.tsx` файл.
84
+ - Публичный API пакета — только то, что явно реэкспортировано в `src/index.ts`. Не используем широкие `export *` для компонентов (только для иконок и zod-схем, где это оправдано).
85
+
86
+ ### Запуск Storybook локально
87
+
88
+ ```bash
89
+ pnpm storybook
90
+ ```
91
+
92
+ Откроется на `http://localhost:6006`. Hot reload работает автоматически при изменении файлов компонентов и `.stories.tsx`.
93
+
94
+ ### Запуск Storybook через Docker (как на сервере)
95
+
96
+ ```bash
97
+ docker compose build storybook
98
+ docker compose up storybook
99
+ ```
100
+
101
+ Откроется на `http://localhost:6006`.
102
+
103
+ ### Сборка пакета (для публикации)
104
+
105
+ ```bash
106
+ pnpm build
107
+ ```
108
+
109
+ Генерирует иконки, прогоняет проверку типов, собирает `dist/` (ESM + CJS + типы + стили) через `vite.config.lib.ts`.
110
+
111
+ Проверить итоговую сборку перед публикацией можно через:
112
+ ```bash
113
+ pnpm pack
114
+ ```
115
+ — создаст `.tgz`-архив, который можно установить в тестовое приложение командой `pnpm add /путь/к/архиву.tgz` и проверить вживую (стили, типы, импорты).
116
+
117
+ ### Публикация новой версии
118
+
119
+ Публикация происходит автоматически через GitLab CI, **только при пуше git-тега** — обычный пуш в `main` пакет не публикует (только обновляет Storybook).
120
+
121
+ Версию поднимаем командой `npm version` — она сама обновляет `package.json`, создаёт коммит и git-тег нужного формата (`vX.Y.Z`), вручную ничего не редактируем:
122
+
123
+ ```bash
124
+ # 1. Закоммить изменения кода
125
+ git add .
126
+ git commit -m "feat: добавлен компонент MyComponent"
127
+
128
+ # 2. Поднять версию (сама создаст commit "vX.Y.Z" и git-тег vX.Y.Z)
129
+ npm version patch # багфикс, без изменения API
130
+ # npm version minor # новый компонент/хук, без breaking changes
131
+ # npm version major # сломан/изменён публичный API
132
+
133
+ # 3. Запушить коммит и тег одной командой
134
+ git push --follow-tags
135
+ ```
136
+
137
+ CI запускает job `build-package` **только когда тег соответствует формату `vX.Y.Z`** (например `v0.2.0`). Так как тег создаёт сам `npm version`, версия в `package.json` и имя тега всегда совпадают автоматически.
138
+
139
+ **Если версия уже была опубликована** — job упадёт с ошибкой `E403`/`cannot publish over previously published version` (npm registry не разрешает переопубликовать существующую версию). В этом случае просто поднимите версию ещё раз (`npm version patch`) и запушьте новый тег.
140
+
141
+ **Правила версионирования:**
142
+
143
+ | Что изменилось | Версия |
144
+ |------------------------------------------|-----------------|
145
+ | Новый компонент / хук, без breaking changes | minor (`0.X.0`) |
146
+ | Багфикс, без изменения API | patch (`0.0.X`) |
147
+ | Сломан/изменён публичный API компонента | major (`X.0.0`) |
148
+
149
+ ### Установка пакета в приложении-потребителе
150
+
151
+ Пакет публичный и опубликован на npmjs.com — никакой дополнительной авторизации для установки не требуется.
152
+
153
+ ```bash
154
+ pnpm add @tk-kit/design-system
155
+ ```
156
+
157
+ ```text
158
+ /* globals.css приложения */
159
+ @import 'tailwindcss';
160
+ @import 'tw-animate-css';
161
+ @import '@tk-kit/design-system/tokens.css';
162
+
163
+ @source "../../../node_modules/@tk-kit/design-system/dist";
164
+ ```
165
+
166
+ ```tsx
167
+ import { Button, TextField } from '@tk-kit/design-system'
168
+ ```
169
+
170
+ **Для CI/CD** — тоже ничего настраивать не нужно, обычный `pnpm install` подтянет пакет с публичного registry:
171
+
172
+ ```yaml
173
+ script:
174
+ - pnpm install
175
+ ```