@1337exp/taoui 1.0.0

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,252 @@
1
+ # Tao UI
2
+
3
+ Библиотека Vue 3 компонентов для Nuxt/Vue проектов с системой дизайн-токенов:
4
+ поменял несколько CSS-переменных — поменялась тема всего набора компонентов.
5
+
6
+ ## Компоненты
7
+
8
+ ### Базовые
9
+
10
+ - **TaoBlock** — базовый контейнер с настраиваемыми отступами и скруглением
11
+ - **TaoButton** — кнопка с вариантами (primary, secondary, ghost, danger), размерами и состояниями
12
+ - **TaoCard** — карточка с поддержкой слотов (cover, headerTitle, header/headerSecondary, title/sub, footer)
13
+ - **TaoCopy** — кнопка копирования текста в буфер обмена
14
+ - **TaoInput** — поле ввода с поддержкой v-model, валидации и различных типов
15
+ - **TaoModal** — модальное окно с анимацией и слотами
16
+ - **TaoSpoiler** — раскрывающийся блок (аккордеон)
17
+ - **TaoTabs** — вкладки для переключения между секциями контента
18
+ - **TaoTooltip** — всплывающая подсказка при наведении
19
+
20
+ ### Layout
21
+
22
+ - **TaoContainer** — контейнер с ограничением ширины (wide/slim/ultra-slim) и авто-центровкой
23
+ - **TaoFlex** — обёртка над flexbox с пропами justify/align/direction/wrap/gap
24
+ - **TaoSpace** — авто-расстановка дочерних элементов с равномерным gap
25
+ - **TaoDivider** — разделитель: line (тонкая линия), text (линия с текстом), gap (пустой отступ)
26
+ - **TaoAnimatedBorder** — контейнер с анимированной радужной рамкой (декоративный, не завязан на тему)
27
+
28
+ ### Формы и ввод
29
+
30
+ - **TaoCheckbox** — чекбокс с поддержкой v-model и слотов pre/post
31
+ - **TaoTextarea** — многострочное поле с авто-высотой и модификаторами (noBorder, noBackground, textCenter, submitOnEnter)
32
+ - **TaoPinCode** — пин-код из N полей с авто-переходом фокуса между ними
33
+ - **TaoSlider** — интерактивный слайдер (drag + клик), с опциональным точным вводом значения по правому клику
34
+ - **TaoFileDrop** — зона загрузки файлов (drag & drop + клик)
35
+
36
+ ### Отображение данных
37
+
38
+ - **TaoTag** — тег/бейдж со статусами (neutral, success, danger)
39
+ - **TaoProgress** — статичная полоса прогресса, опционально с shimmer-анимацией
40
+ - **TaoLoader** — анимированный лоадер (четыре точки)
41
+ - **TaoImage** — обёртка над `<img>` с плавным fade-in при загрузке и плейсхолдером
42
+ - **TaoIcon** — обёртка для icon-шрифта (см. раздел «Иконки» ниже)
43
+
44
+ ### Навигация и взаимодействие
45
+
46
+ - **TaoLink** — ссылка, использующая `<NuxtLink>` в Nuxt-проекте и обычный `<a>` вне его — без дополнительной настройки
47
+ - **TaoDropdownMenu** — выпадающее меню с авто-позиционированием у края экрана
48
+ - **TaoScrollTop** — плавающая кнопка «наверх» с ripple-эффектом, появляется при обратном скролле
49
+
50
+ ## Иконки
51
+
52
+ `TaoIcon` не поставляет собственный набор иконок — он рендерит класс `icon-<name>`
53
+ по соглашению, рассчитанному на подключение внешнего icon-шрифта (например,
54
+ собранного через IcoMoon/Fontello). Чтобы иконки отображались, подключите
55
+ свой шрифт с классами вида `.icon-arrow-up { ... }` в проекте.
56
+
57
+ ## Установка
58
+
59
+ ```bash
60
+ npm install @tao/ui
61
+ ```
62
+
63
+ Или локально из папки:
64
+
65
+ ```bash
66
+ npm install ../path-to-tao-ui
67
+ ```
68
+
69
+ ## Использование
70
+
71
+ ### Подключение в Nuxt 3
72
+
73
+ Создайте плагин `plugins/tao-ui.ts`:
74
+
75
+ ```typescript
76
+ import { defineNuxtPlugin } from '#app'
77
+ import TaoUI from '@tao/ui'
78
+
79
+ export default defineNuxtPlugin((nuxtApp) => {
80
+ nuxtApp.vueApp.use(TaoUI)
81
+ })
82
+ ```
83
+
84
+ Импортируйте стили в `app.vue` или layout:
85
+
86
+ ```vue
87
+ <script setup>
88
+ import '@tao/ui/styles.css'
89
+ </script>
90
+ ```
91
+
92
+ ### Подключение в Vue 3 проекте
93
+
94
+ ```javascript
95
+ // main.js
96
+ import { createApp } from 'vue'
97
+ import App from './App.vue'
98
+ import TaoUI from '@tao/ui'
99
+ import '@tao/ui/styles.css'
100
+
101
+ const app = createApp(App)
102
+ app.use(TaoUI)
103
+ app.mount('#app')
104
+ ```
105
+
106
+ ### Использование отдельных компонентов
107
+
108
+ ```vue
109
+ <script setup>
110
+ import { TaoButton, TaoInput, TaoModal } from '@tao/ui'
111
+ import '@tao/ui/styles.css'
112
+ </script>
113
+
114
+ <template>
115
+ <TaoButton variant="primary">Нажми меня</TaoButton>
116
+ <TaoInput v-model="text" label="Введите текст" />
117
+ <TaoModal v-model="isOpen" title="Заголовок">
118
+ Содержимое модального окна
119
+ </TaoModal>
120
+ </template>
121
+ ```
122
+
123
+ ## Дизайн-токены и темизация
124
+
125
+ Стили библиотеки построены в три слоя. Компоненты **никогда** не обращаются
126
+ к цветам/размерам напрямую — только через переменные из семантического слоя.
127
+ Это и есть механизм темизации: переопределяете 20-30 переменных — меняется
128
+ внешний вид всех компонентов сразу, без правок самих компонентов.
129
+
130
+ ```
131
+ primitives.css → semantic.css → themes/*.css (опционально)
132
+ сырые цвета публичный API готовые темы поверх
133
+ и размеры, темизации: semantic — пример: light
134
+ не трогать вот что менять
135
+ ```
136
+
137
+ ### Слои
138
+
139
+ | Файл | Назначение | Трогать? |
140
+ |---|---|---|
141
+ | `primitives.css` | Сырая палитра, шкалы отступов/радиусов/теней (`--tao-orange-400`, `--tao-space-3`...) | Обычно нет |
142
+ | `semantic.css` | Токены темы по умолчанию (dark): `--tao-color-accent`, `--tao-color-surface`, `--tao-color-danger` и т.д. | **Да — это и есть API темизации** |
143
+ | `themes/light.css` | Пример альтернативной темы через `[data-tao-theme="light"]` | Да, как образец |
144
+ | `base.css` | Глобальный reset (скроллбар, ссылки, box-sizing) | Редко |
145
+
146
+ Все четыре подключаются одним файлом `@tao/ui/styles.css`.
147
+
148
+ ### Как сделать свою тему
149
+
150
+ Тема — это просто переопределение семантических токенов под своим селектором.
151
+ Ничего в компонентах менять не нужно:
152
+
153
+ ```css
154
+ /* my-brand-theme.css */
155
+ [data-tao-theme="my-brand"] {
156
+ --tao-color-accent: #6c5ce7;
157
+ --tao-color-accent-hover: #5a4bd1;
158
+ --tao-color-bg: #0f0f1a;
159
+ --tao-color-surface: #0f0f1a;
160
+ --tao-color-surface-raised: #1a1a2e;
161
+ --tao-color-text: #d6d6e8;
162
+ --tao-color-text-strong: #ffffff;
163
+ /* остальные токены см. semantic.css */
164
+ }
165
+ ```
166
+
167
+ ```vue
168
+ <!-- app.vue -->
169
+ <template>
170
+ <div data-tao-theme="my-brand">
171
+ <NuxtPage />
172
+ </div>
173
+ </template>
174
+ ```
175
+
176
+ Или переключайте тему целиком на `<html>`, чтобы стилизовать модалки/тултипы,
177
+ которые телепортируются в `body`:
178
+
179
+ ```javascript
180
+ document.documentElement.setAttribute('data-tao-theme', 'light')
181
+ ```
182
+
183
+ ### Ключевые группы токенов
184
+
185
+ - `--tao-color-accent*` — акцентный/брендовый цвет (кнопки primary, активные вкладки, ссылки)
186
+ - `--tao-color-surface*` — фоны контейнеров (обычный / приподнятый / утопленный / hover)
187
+ - `--tao-color-border*` — границы
188
+ - `--tao-color-text*` — текст (обычный / усиленный / приглушённый / disabled)
189
+ - `--tao-color-danger*`, `--tao-color-success*` — статусные цвета
190
+ - `--tao-color-input-*` — поля ввода отдельно, т.к. фон/текст полей часто не совпадают с surface/text
191
+ - `--tao-radius-control`, `--tao-radius-panel` — скругления (мелкие контролы vs крупные панели)
192
+ - `--tao-shadow-panel`, `--tao-shadow-overlay` — тени
193
+
194
+ Полный список — в `src/styles/semantic.css`, он же единственный файл,
195
+ который стоит открыть, чтобы понять весь доступный API темизации.
196
+
197
+ ### Если нужна тема с нуля, без primitives
198
+
199
+ ```javascript
200
+ import '@tao/ui/styles/primitives.css' // шкалы можно оставить
201
+ import './my-semantic.css' // свой семантический слой вместо @tao/ui/styles/semantic.css
202
+ import '@tao/ui/styles/base.css'
203
+ ```
204
+
205
+ ## Демонстрация
206
+
207
+ Для просмотра всех компонентов запустите showcase:
208
+
209
+ ```bash
210
+ cd showcase
211
+ npm install
212
+ npm run dev
213
+ ```
214
+
215
+ В showcase есть переключатель темы (dark / light) в шапке — так виден
216
+ эффект переопределения токенов без правок кода компонентов.
217
+
218
+ ## Разработка
219
+
220
+ ```bash
221
+ # Сборка библиотеки
222
+ npm run build
223
+
224
+ # Режим разработки (watch)
225
+ npm run dev
226
+
227
+ # Проверка типов
228
+ npm run type-check
229
+ ```
230
+
231
+ ## Публикация в npm
232
+
233
+ Публикуется только `dist/` (собранная библиотека) и `src/styles/` (сырые
234
+ токены — чтобы можно было подключить `primitives.css` отдельно при
235
+ кастомной теме). Исходники компонентов (`src/components/*.vue`),
236
+ конфиги сборки и `showcase/` в пакет не попадают — они остаются в
237
+ репозитории; чтобы их получить, репозиторий клонируют.
238
+
239
+ `npm publish` **сам** прогоняет проверку типов и полную пересборку перед
240
+ публикацией (хук `prepublishOnly` в `package.json`) — так в реестр не
241
+ уедет пакет со старым или отсутствующим `dist/`. Собирать вручную перед
242
+ `npm publish` не нужно.
243
+
244
+ Проверить, что именно попадёт в пакет, без реальной публикации:
245
+
246
+ ```bash
247
+ npm pack --dry-run
248
+ ```
249
+
250
+ ## Лицензия
251
+
252
+ MIT