@1337exp/taoui 1.0.2 → 1.1.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 +217 -4
- package/dist/index.cjs +4132 -248
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1729 -269
- package/dist/index.mjs +4134 -250
- package/dist/index.mjs.map +1 -1
- package/dist/styles.css +2088 -164
- package/package.json +1 -1
- package/src/styles/base.css +12 -0
- package/src/styles/primitives.css +8 -0
- package/src/styles/semantic.css +7 -0
- package/src/styles/themes/light.css +7 -0
package/README.md
CHANGED
|
@@ -11,8 +11,10 @@
|
|
|
11
11
|
- **TaoButton** — кнопка с вариантами (primary, secondary, ghost, danger), размерами и состояниями
|
|
12
12
|
- **TaoCard** — карточка с поддержкой слотов (cover, headerTitle, header/headerSecondary, title/sub, footer)
|
|
13
13
|
- **TaoCopy** — кнопка копирования текста в буфер обмена
|
|
14
|
-
- **TaoInput** — поле ввода с поддержкой v-model, валидации и
|
|
14
|
+
- **TaoInput** — поле ввода с поддержкой v-model, валидации и слотов `#prefix` / `#suffix` (иконка или текст внутри рамки)
|
|
15
|
+
- **TaoInputGroup** — склейка снаружи: `#before` | поле | `#after` (протокол, единица, кнопка)
|
|
15
16
|
- **TaoModal** — модальное окно с анимацией и слотами
|
|
17
|
+
- **TaoDrawer** — боковая панель (фильтры, настройки). Esc, клик по фону, ловушка фокуса — как у модалки
|
|
16
18
|
- **TaoSpoiler** — раскрывающийся блок (аккордеон)
|
|
17
19
|
- **TaoTabs** — вкладки для переключения между секциями контента
|
|
18
20
|
- **TaoTooltip** — всплывающая подсказка при наведении
|
|
@@ -28,14 +30,30 @@
|
|
|
28
30
|
### Формы и ввод
|
|
29
31
|
|
|
30
32
|
- **TaoCheckbox** — чекбокс с поддержкой v-model и слотов pre/post
|
|
33
|
+
- **TaoSwitch** — переключатель для булевых настроек (`role="switch"`)
|
|
34
|
+
- **TaoRadio** / **TaoRadioGroup** — взаимоисключающий выбор из 2–5 вариантов
|
|
35
|
+
- **TaoSelect** — выпадающий список с клавиатурой, тот же визуал, что у Input
|
|
36
|
+
- **TaoDate** — один день: `YYYY-MM-DD`, без часов и пояса. Календарь как у Select
|
|
37
|
+
- **TaoFormField** — общие label / hint / error для полей формы
|
|
38
|
+
- **TaoInputNumber** — число с min/max/step и кнопками ± справа. Пустое значение — `null`
|
|
39
|
+
- **TaoQuantity** — количество в корзине: `− | поле | +`, целые штуки, сток, минус на минимуме может убрать строку
|
|
31
40
|
- **TaoTextarea** — многострочное поле с авто-высотой и модификаторами (noBorder, noBackground, textCenter, submitOnEnter)
|
|
32
41
|
- **TaoPinCode** — пин-код из N полей с авто-переходом фокуса между ними
|
|
33
42
|
- **TaoSlider** — интерактивный слайдер (drag + клик), с опциональным точным вводом значения по правому клику
|
|
34
|
-
- **TaoFileDrop** — зона загрузки файлов (drag & drop + клик)
|
|
43
|
+
- **TaoFileDrop** — зона загрузки файлов (drag & drop + клик). Текст внутри — слот
|
|
35
44
|
|
|
36
45
|
### Отображение данных
|
|
37
46
|
|
|
38
|
-
- **
|
|
47
|
+
- **TaoTable** — простая таблица: колонки, empty, loading, сортировка через `v-model:sort`. Не datagrid.
|
|
48
|
+
- **TaoPagination** — страницы с многоточием. Клик по «…» прыгает на `jump` страниц (5 по умолчанию)
|
|
49
|
+
- **TaoEmpty** — пустой список, нет результатов, нет прав
|
|
50
|
+
- **TaoStages** — список стадий: `wait` / `work` / `ok` / `bad`. Не линейный степпер
|
|
51
|
+
- **TaoSkeleton** — плейсхолдер загрузки (text / title / circle / rect)
|
|
52
|
+
- **TaoCounter** — витрина числа с переворотом цифр (не инпут)
|
|
53
|
+
- **TaoCarousel** — лента: целый слайд с `autoplay`, карточка с `peek`, полоса с `per-view`. Стрелки через `controls` или `#prev` / `#next`, точки — `dots`
|
|
54
|
+
- **TaoAvatar** — фото или инициалы
|
|
55
|
+
- **TaoTag** — тег/бейдж со статусами (neutral, success, danger, warning, info)
|
|
56
|
+
- **TaoAlert** — инлайн-баннер страницы или ошибки формы (success / error / warning / info)
|
|
39
57
|
- **TaoProgress** — статичная полоса прогресса, опционально с shimmer-анимацией
|
|
40
58
|
- **TaoLoader** — анимированный лоадер (четыре точки)
|
|
41
59
|
- **TaoImage** — обёртка над `<img>` с плавным fade-in при загрузке и плейсхолдером
|
|
@@ -44,9 +62,16 @@
|
|
|
44
62
|
### Навигация и взаимодействие
|
|
45
63
|
|
|
46
64
|
- **TaoLink** — ссылка, использующая `<NuxtLink>` в Nuxt-проекте и обычный `<a>` вне его — без дополнительной настройки
|
|
65
|
+
- **TaoBreadcrumb** — крошки: последний пункт — текущая страница
|
|
47
66
|
- **TaoDropdownMenu** — выпадающее меню с авто-позиционированием у края экрана
|
|
48
67
|
- **TaoScrollTop** — плавающая кнопка «наверх» с ripple-эффектом, появляется при обратном скролле
|
|
49
68
|
|
|
69
|
+
### Обратная связь
|
|
70
|
+
|
|
71
|
+
- **toast()** — fluent-уведомления: `toast().success().message('Сохранено')`
|
|
72
|
+
- **confirm()** — вопрос с оверлеем: тот же fluent + `await`. Не тост — ждёт ответ, не исчезает сам.
|
|
73
|
+
- **TaoToastViewport** / **TaoConfirmHost** — контейнеры; если их нет в разметке, первый вызов сам монтирует их в `body`
|
|
74
|
+
|
|
50
75
|
## Иконки
|
|
51
76
|
|
|
52
77
|
`TaoIcon` не поставляет собственный набор иконок — он рендерит класс `icon-<name>`
|
|
@@ -116,6 +141,190 @@ import '@1337exp/taoui/styles.css'
|
|
|
116
141
|
</template>
|
|
117
142
|
```
|
|
118
143
|
|
|
144
|
+
## Toast
|
|
145
|
+
|
|
146
|
+
Вызов — цепочка в одном тике, `setTimeout(0)` отправляет уведомление.
|
|
147
|
+
|
|
148
|
+
```javascript
|
|
149
|
+
import { toast } from '@1337exp/taoui'
|
|
150
|
+
|
|
151
|
+
toast().success().message('Сохранено')
|
|
152
|
+
toast().error().title('Сеть').timeout(5000).message('Нет соединения')
|
|
153
|
+
toast.success('Сохранено')
|
|
154
|
+
toast.warning('Черновик', { timeout: 1000 })
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
Позиция по умолчанию — `topCenter`. Глобально:
|
|
158
|
+
|
|
159
|
+
```javascript
|
|
160
|
+
toast.defaults({ position: 'bottomRight' })
|
|
161
|
+
toast.byBottomRight()
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
`question` с оверлеем в kit нет — это confirm, не toast. Кнопки в тосте, если нужны:
|
|
165
|
+
|
|
166
|
+
```javascript
|
|
167
|
+
toast().info().message('Удалить файл?').action('Удалить', onRemove)
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
Viewport можно не вставлять: первый вызов сам создаст его. Если нужен явный контроль (тесты, свой layout):
|
|
171
|
+
|
|
172
|
+
```vue
|
|
173
|
+
<TaoToastViewport />
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
## Confirm
|
|
177
|
+
|
|
178
|
+
Вопрос с оверлеем: всплывает по центру и спрашивает. Это не toast — нет прогресс-бара и автозакрытия, есть `await`, Esc и клик по оверлею = отмена.
|
|
179
|
+
|
|
180
|
+
```javascript
|
|
181
|
+
import { confirm } from '@1337exp/taoui'
|
|
182
|
+
|
|
183
|
+
if (await confirm().title('Удалить файл?').message('Это нельзя отменить').danger()) {
|
|
184
|
+
remove()
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
const ok = await confirm('Выйти без сохранения?', {
|
|
188
|
+
ok: 'Выйти',
|
|
189
|
+
cancel: 'Остаться',
|
|
190
|
+
})
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
Очередь: второй `confirm()`, пока открыт первый, подождёт. Подписи по умолчанию — «ОК» / «Отмена»:
|
|
194
|
+
|
|
195
|
+
```javascript
|
|
196
|
+
confirm.defaults({ ok: 'Yes', cancel: 'No' })
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
## Формы
|
|
200
|
+
|
|
201
|
+
`TaoFormField` вешает общий label / hint / error и прокидывает `id` во вложенный контрол.
|
|
202
|
+
|
|
203
|
+
```vue
|
|
204
|
+
<TaoFormField label="Город" hint="Необязательно">
|
|
205
|
+
<TaoSelect v-model="city" :options="cities" />
|
|
206
|
+
</TaoFormField>
|
|
207
|
+
|
|
208
|
+
<TaoSwitch v-model="dark" label="Тёмная тема" />
|
|
209
|
+
|
|
210
|
+
<TaoRadioGroup v-model="plan" legend="Тариф">
|
|
211
|
+
<TaoRadio value="free" label="Free" />
|
|
212
|
+
<TaoRadio value="pro" label="Pro" />
|
|
213
|
+
</TaoRadioGroup>
|
|
214
|
+
|
|
215
|
+
<TaoAlert type="warning" title="Черновик">Сохраните, прежде чем уйти.</TaoAlert>
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
`TaoSelect` открывается с клавиатуры (стрелки, Enter, Esc), список переворачивается у края экрана.
|
|
219
|
+
|
|
220
|
+
## Таблица и пагинация
|
|
221
|
+
|
|
222
|
+
Таблица рендерит то, что передали: сама данные не режет и не сортирует. Это удобно и для серверной выборки, и для клиентской — страница режется снаружи.
|
|
223
|
+
|
|
224
|
+
```vue
|
|
225
|
+
<TaoTable
|
|
226
|
+
:columns="columns"
|
|
227
|
+
:rows="pageRows"
|
|
228
|
+
v-model:sort="sort"
|
|
229
|
+
empty-text="Пока нет записей"
|
|
230
|
+
>
|
|
231
|
+
<template #cell-status="{ row }">
|
|
232
|
+
<TaoTag :type="row.status === 'active' ? 'success' : 'neutral'">
|
|
233
|
+
{{ row.status }}
|
|
234
|
+
</TaoTag>
|
|
235
|
+
</template>
|
|
236
|
+
</TaoTable>
|
|
237
|
+
|
|
238
|
+
<TaoPagination v-model:page="page" :total="rows.length" :page-size="8" />
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
```javascript
|
|
242
|
+
const columns = [
|
|
243
|
+
{ key: 'name', label: 'Имя', sortable: true },
|
|
244
|
+
{ key: 'city', label: 'Город' },
|
|
245
|
+
{ key: 'status', label: 'Статус' },
|
|
246
|
+
]
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
Слот `cell-<ключ>` перекрывает ячейку. `loading` показывает оверлей, пустой список — текст или слот `#empty`. Клик по шапке с `sortable` крутит `asc → desc → сброс`.
|
|
250
|
+
|
|
251
|
+
## Пустые состояния и загрузка
|
|
252
|
+
|
|
253
|
+
```vue
|
|
254
|
+
<TaoEmpty title="Ничего не нашлось">
|
|
255
|
+
Измените фильтр или сбросьте поиск.
|
|
256
|
+
<template #action>
|
|
257
|
+
<TaoButton variant="secondary">Сбросить</TaoButton>
|
|
258
|
+
</template>
|
|
259
|
+
</TaoEmpty>
|
|
260
|
+
|
|
261
|
+
<TaoSkeleton variant="title" />
|
|
262
|
+
<TaoSkeleton :lines="3" />
|
|
263
|
+
<TaoSkeleton variant="circle" />
|
|
264
|
+
|
|
265
|
+
<TaoStages :items="[
|
|
266
|
+
{ key: 'pay', label: 'Оплата', status: 'ok' },
|
|
267
|
+
{ key: 'pack', label: 'Сборка', status: 'work' },
|
|
268
|
+
{ key: 'ship', label: 'Доставка', status: 'wait' },
|
|
269
|
+
]" />
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
```vue
|
|
273
|
+
<TaoInput v-model="q" placeholder="Найти…">
|
|
274
|
+
<template #prefix>⌕</template>
|
|
275
|
+
</TaoInput>
|
|
276
|
+
|
|
277
|
+
<TaoInputGroup>
|
|
278
|
+
<template #before>https://</template>
|
|
279
|
+
<TaoInput v-model="host" placeholder="example.com" />
|
|
280
|
+
<template #after>
|
|
281
|
+
<TaoButton>Проверить</TaoButton>
|
|
282
|
+
</template>
|
|
283
|
+
</TaoInputGroup>
|
|
284
|
+
|
|
285
|
+
<form @submit.prevent="onSave">
|
|
286
|
+
<TaoFormField label="Email">
|
|
287
|
+
<TaoInput v-model="email" type="email" />
|
|
288
|
+
</TaoFormField>
|
|
289
|
+
<TaoButton type="submit">Сохранить</TaoButton>
|
|
290
|
+
</form>
|
|
291
|
+
|
|
292
|
+
<TaoFormField label="Количество">
|
|
293
|
+
<TaoInputNumber v-model="qty" :min="1" :max="99" />
|
|
294
|
+
</TaoFormField>
|
|
295
|
+
|
|
296
|
+
<TaoQuantity v-model="qty" :max="12" @dec="onDec" />
|
|
297
|
+
|
|
298
|
+
<TaoFormField label="День доставки" hint="В модели всегда YYYY-MM-DD">
|
|
299
|
+
<TaoDate v-model="day" min="2026-09-01" max="2026-09-30" />
|
|
300
|
+
</TaoFormField>
|
|
301
|
+
|
|
302
|
+
<TaoCounter :value="score" :max-digits="6" />
|
|
303
|
+
|
|
304
|
+
<TaoCarousel :autoplay="4000" loop dots>
|
|
305
|
+
<article v-for="item in banners" :key="item.id" class="hero">
|
|
306
|
+
<strong>{{ item.title }}</strong>
|
|
307
|
+
<span>{{ item.text }}</span>
|
|
308
|
+
</article>
|
|
309
|
+
</TaoCarousel>
|
|
310
|
+
<TaoCarousel :peek="72" :controls="false" dots>…</TaoCarousel>
|
|
311
|
+
<TaoCarousel v-model="slide" :per-view="5" :peek="28">
|
|
312
|
+
<template #prev></template>
|
|
313
|
+
<template #next="{ go, disabled }">
|
|
314
|
+
<button type="button" :disabled="disabled" @click="go">вперёд</button>
|
|
315
|
+
</template>
|
|
316
|
+
<article v-for="item in products" :key="item.id">…</article>
|
|
317
|
+
</TaoCarousel>
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
`TaoDrawer` — лист сбоку, не модалка по центру:
|
|
321
|
+
|
|
322
|
+
```vue
|
|
323
|
+
<TaoDrawer v-model="open" title="Фильтры">
|
|
324
|
+
...
|
|
325
|
+
</TaoDrawer>
|
|
326
|
+
```
|
|
327
|
+
|
|
119
328
|
## Дизайн-токены и темизация
|
|
120
329
|
|
|
121
330
|
Стили библиотеки построены в три слоя. Компоненты **никогда** не обращаются
|
|
@@ -182,7 +391,7 @@ document.documentElement.setAttribute('data-tao-theme', 'light')
|
|
|
182
391
|
- `--tao-color-surface*` — фоны контейнеров (обычный / приподнятый / утопленный / hover)
|
|
183
392
|
- `--tao-color-border*` — границы
|
|
184
393
|
- `--tao-color-text*` — текст (обычный / усиленный / приглушённый / disabled)
|
|
185
|
-
- `--tao-color-danger*`, `--tao-color-success*` — статусные цвета
|
|
394
|
+
- `--tao-color-danger*`, `--tao-color-success*`, `--tao-color-warning*`, `--tao-color-info*` — статусные цвета
|
|
186
395
|
- `--tao-color-input-*` — поля ввода отдельно, т.к. фон/текст полей часто не совпадают с surface/text
|
|
187
396
|
- `--tao-radius-control`, `--tao-radius-panel` — скругления (мелкие контролы vs крупные панели)
|
|
188
397
|
- `--tao-shadow-panel`, `--tao-shadow-overlay` — тени
|
|
@@ -211,6 +420,10 @@ npm run dev
|
|
|
211
420
|
В showcase есть переключатель темы (dark / light) в шапке — так виден
|
|
212
421
|
эффект переопределения токенов без правок кода компонентов.
|
|
213
422
|
|
|
423
|
+
Showcase смотрит прямо в `src/`, поэтому правки компонентов видны без
|
|
424
|
+
`npm run build`. Сборка `dist/` нужна для публикации и для чужих проектов,
|
|
425
|
+
которые ставят пакет.
|
|
426
|
+
|
|
214
427
|
## Разработка
|
|
215
428
|
|
|
216
429
|
```bash
|