@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 +252 -0
- package/dist/index.cjs +1745 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +1635 -0
- package/dist/index.mjs +1742 -0
- package/dist/index.mjs.map +1 -0
- package/dist/styles.css +1476 -0
- package/package.json +57 -0
- package/src/styles/base.css +59 -0
- package/src/styles/index.css +9 -0
- package/src/styles/primitives.css +73 -0
- package/src/styles/semantic.css +72 -0
- package/src/styles/themes/light.css +51 -0
- package/src/styles/variables.css +77 -0
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
|