@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 +175 -0
- package/dist/index.cjs +5 -5
- package/dist/index.js +1170 -1163
- package/package.json +1 -1
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
|
+
```
|