@boobooking/dashboard-ui-components 0.9.0 → 0.10.1
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 +71 -52
- package/dist/index.js +281 -173
- package/dist/style.css +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -28,14 +28,18 @@ createApp(App).use(dashboardUi, {
|
|
|
28
28
|
})
|
|
29
29
|
```
|
|
30
30
|
|
|
31
|
-
- `lang` — `'ru'` (по умолчанию) или `'en'`; другое значение — ошибка в
|
|
31
|
+
- `lang` — `'ru'` (по умолчанию) или `'en'`; другое значение — ошибка в
|
|
32
|
+
`app.use`.
|
|
32
33
|
- `navigate(href)` — переход приложения по адресу: для Inertia
|
|
33
34
|
`router.visit(href)`, для Vue Router `router.push(href)`. Компоненты рисуют
|
|
34
35
|
настоящий `<a href>` и отдают `navigate` только обычный клик левой кнопкой;
|
|
35
36
|
клики с Ctrl/Cmd/Shift/Alt, средней кнопкой и ссылки с `target` остаются
|
|
36
37
|
браузеру. Без `navigate` браузер идёт по ссылке сам.
|
|
37
38
|
|
|
38
|
-
`navigate` получает адрес ровно таким, каким он лежит в компоненте:
|
|
39
|
+
`navigate` получает адрес ровно таким, каким он лежит в компоненте:
|
|
40
|
+
`Pagination` отдаёт `links` Laravel как есть, а это абсолютные URL. С Vue
|
|
41
|
+
Router приложение само превращает их в маршрут, например
|
|
42
|
+
`new URL(href).pathname + search`, и только потом зовёт `router.push`.
|
|
39
43
|
|
|
40
44
|
## Требования
|
|
41
45
|
|
|
@@ -50,12 +54,12 @@ Tailwind, `@tailwindcss/forms`, Inertia и какие-либо токены в C
|
|
|
50
54
|
|
|
51
55
|
Пакет экспортирует семнадцать компонентов: `Popup`, `Dot`, `PickDay`,
|
|
52
56
|
`RussianMobileFilter`, `Search`, `SelectDateInterval`, `SelectSingle`,
|
|
53
|
-
`SmallBadge`, `ErrorMessages`, `Closer`, `DownloadLink`,
|
|
57
|
+
`SmallBadge`, `ErrorMessages`, `Closer`, `DownloadLink`,
|
|
54
58
|
`ConfirmationModal`, `DropdownButtonWithAction`, `Pagination`,
|
|
55
|
-
`NavigationMenuElement`, `PageCard` и плагин
|
|
56
|
-
(`files: ["dist"]`) исходники не
|
|
57
|
-
|
|
58
|
-
|
|
59
|
+
`NavigationMenuElement`, `PageCard`, `NotificationMessage` и плагин
|
|
60
|
+
`dashboardUi`. В архив пакета (`files: ["dist"]`) исходники не попадают,
|
|
61
|
+
поэтому контракт каждого компонента — здесь и в playground, а не в исходном
|
|
62
|
+
коде.
|
|
59
63
|
|
|
60
64
|
### Popup
|
|
61
65
|
|
|
@@ -250,44 +254,6 @@ Tailwind, `@tailwindcss/forms`, Inertia и какие-либо токены в C
|
|
|
250
254
|
|
|
251
255
|
Событий нет.
|
|
252
256
|
|
|
253
|
-
### Modal
|
|
254
|
-
|
|
255
|
-
Оболочка модального окна: оверлей, панель и переходы открытия и закрытия.
|
|
256
|
-
Заголовок, текст и кнопки кладёт в слот приложение. На этой оболочке построен
|
|
257
|
-
`ConfirmationModal`.
|
|
258
|
-
|
|
259
|
-
<modal :is-open="isOpen" :heading-id="headingId">
|
|
260
|
-
<h3 :id="headingId">Заголовок</h3>
|
|
261
|
-
…содержимое…
|
|
262
|
-
</modal>
|
|
263
|
-
|
|
264
|
-
| Проп | Тип | По умолчанию | Описание |
|
|
265
|
-
| --- | --- | --- | --- |
|
|
266
|
-
| `isOpen` | `Boolean` | `false` | Открыта ли модалка |
|
|
267
|
-
| `headingId` | `String` | обязателен | `id` заголовка в слоте: им модалка подписывает диалог через `aria-labelledby` |
|
|
268
|
-
|
|
269
|
-
Событий нет. Модалка не закрывается сама ни по клику на оверлей, ни по
|
|
270
|
-
Escape: видимостью управляет родитель, как у `ConfirmationModal`. `id`
|
|
271
|
-
заголовка удобно получать через `useId()` — тогда у двух модалок на одной
|
|
272
|
-
странице он не совпадёт.
|
|
273
|
-
|
|
274
|
-
Содержимое слота смонтировано всегда, а закрытая модалка его только прячет
|
|
275
|
-
(`v-show`). Поэтому состояние внутри — выбор, введённый текст, ошибки —
|
|
276
|
-
переживает закрытие, и сбрасывать его должен родитель.
|
|
277
|
-
|
|
278
|
-
Панель белая, со скруглением `rounded-lg` и без внутренних отступов: их
|
|
279
|
-
задаёт содержимое слота. На узком экране панель прижата к нижнему краю, а её
|
|
280
|
-
ширина — по содержимому, но не больше экрана за вычетом полей; начиная с `sm`
|
|
281
|
-
панель стоит по центру и занимает `max-w-lg`. `class` и другие атрибуты на
|
|
282
|
-
`<modal>` попадают на полноэкранный корень, а не на панель: размер панели и
|
|
283
|
-
атрибуты диалога вроде `aria-describedby` снаружи не задаются.
|
|
284
|
-
|
|
285
|
-
Панель не обрезает содержимое, чтобы выпадающие списки и календари внутри
|
|
286
|
-
модалки могли выходить за её край. Поэтому блок слота со своим фоном у края
|
|
287
|
-
панели сам скругляет внешние углы — верхний `rounded-t-lg`, нижний
|
|
288
|
-
`rounded-b-lg`, — иначе его квадратные углы закроют скругление панели. Так
|
|
289
|
-
сделано у `ConfirmationModal`.
|
|
290
|
-
|
|
291
257
|
### ConfirmationModal
|
|
292
258
|
|
|
293
259
|
Модалка подтверждения действия: заголовок, текст, кнопка действия и кнопка
|
|
@@ -317,6 +283,13 @@ Escape: видимостью управляет родитель, как у `Con
|
|
|
317
283
|
отмены. Ни одна из кнопок модалку не закрывает — см. раздел «Почему у
|
|
318
284
|
ConfirmationModal нет v-model».
|
|
319
285
|
|
|
286
|
+
Панель модалки — белая, со скруглением `rounded-lg`: на узком экране прижата
|
|
287
|
+
к нижнему краю, начиная с `sm` стоит по центру и занимает `max-w-lg`. `class` и
|
|
288
|
+
другие атрибуты на `<confirmation-modal>` попадают на полноэкранный корень, а
|
|
289
|
+
не на панель. Панель не обрезает содержимое, поэтому блоки текста и кнопок со
|
|
290
|
+
своим фоном скругляют внешние углы сами — верхний `rounded-t-lg`, нижний
|
|
291
|
+
`rounded-b-lg`.
|
|
292
|
+
|
|
320
293
|
### DropdownButtonWithAction
|
|
321
294
|
|
|
322
295
|
Кнопка с меню дополнительных действий: основная часть — слот `button`, стрелка
|
|
@@ -415,9 +388,10 @@ sm:rounded-lg`, `box-sizing: border-box`. Отступов у неё нет: ф
|
|
|
415
388
|
`padding-right: var(--bb-closer-space)`, а в Tailwind 3 —
|
|
416
389
|
`pr-[var(--bb-closer-space)]`. Вне `PageCard` отступ равен нулю.
|
|
417
390
|
|
|
418
|
-
Карточка не обрезает содержимое, как `
|
|
419
|
-
могут выходить за её край. Блок со своим фоном у края карточки
|
|
420
|
-
углы сам — например, нижний блок строк:
|
|
391
|
+
Карточка не обрезает содержимое, как у `ConfirmationModal`: выпадающие списки
|
|
392
|
+
и календари могут выходить за её край. Блок со своим фоном у края карточки
|
|
393
|
+
скругляет свои углы сам — например, нижний блок строк:
|
|
394
|
+
`overflow-hidden sm:rounded-b-lg`.
|
|
421
395
|
|
|
422
396
|
Крестик доступен с клавиатуры: Tab, Enter, пробел; в порядке табуляции крестик
|
|
423
397
|
идёт после содержимого карточки; при фокусе с клавиатуры
|
|
@@ -429,6 +403,47 @@ sm:rounded-lg`, `box-sizing: border-box`. Отступов у неё нет: ф
|
|
|
429
403
|
|
|
430
404
|
Событий нет.
|
|
431
405
|
|
|
406
|
+
### NotificationMessage
|
|
407
|
+
|
|
408
|
+
Всплывающее уведомление: заголовок, текст, иконка по типу и крестик закрытия.
|
|
409
|
+
На узком экране стоит снизу по центру, начиная с `sm` — в правом верхнем углу.
|
|
410
|
+
|
|
411
|
+
<notification-message
|
|
412
|
+
v-model="message"
|
|
413
|
+
type="confirmation"
|
|
414
|
+
notification-heading="Письмо отправлено"
|
|
415
|
+
/>
|
|
416
|
+
|
|
417
|
+
| Проп | Тип | По умолчанию | Описание |
|
|
418
|
+
| --- | --- | --- | --- |
|
|
419
|
+
| `modelValue` | `String` | `""` | Текст уведомления; пустая строка или `null` — уведомления нет |
|
|
420
|
+
| `type` | `String` | `"warning"` | `"confirmation"` (галочка, серый фон), `"warning"` (жёлтое) или `"dangerous"` (красное) |
|
|
421
|
+
| `notificationHeading` | `String` | `""` | Заголовок |
|
|
422
|
+
| `lang` | `String` | язык плагина | `"ru"` или `"en"` |
|
|
423
|
+
|
|
424
|
+
Уведомление показано, пока текст непуст. Крестик закрывает его сам — эмитит
|
|
425
|
+
`update:modelValue` с пустой строкой, поэтому странице достаточно `v-model`.
|
|
426
|
+
Других событий нет.
|
|
427
|
+
|
|
428
|
+
Для скринридера уведомление — живая область: `role="alert"` у `dangerous`,
|
|
429
|
+
`role="status"` у остальных. Область есть на странице всегда, а пустая
|
|
430
|
+
невидима и не перехватывает клики. Скринридер объявляет текст, который
|
|
431
|
+
появился после монтирования компонента; текст, уже стоявший при монтировании,
|
|
432
|
+
может остаться необъявленным. Роль задаётся типом, поэтому `type` стоит менять
|
|
433
|
+
только пока текст пуст — проще всего держать по экземпляру на каждый тип.
|
|
434
|
+
Показывайте одно уведомление за раз: все они стоят в одном углу. Подпись
|
|
435
|
+
крестика для скринридера — «Закрыть» / «Close». После закрытия с клавиатуры
|
|
436
|
+
фокус не возвращается и уходит на `body` страницы.
|
|
437
|
+
|
|
438
|
+
Корень — на весь экран (`fixed inset-0`), с ресетом пакета; слотов нет.
|
|
439
|
+
|
|
440
|
+
У корня нет `z-index`, поэтому среди позиционированных элементов он рисуется в
|
|
441
|
+
порядке DOM: ставьте компонент в разметке страницы последним. Под открытой
|
|
442
|
+
модалкой или выпадающим меню пакета (их подложки — `z-20`) уведомление скрыто,
|
|
443
|
+
а его крестик не нажимается, поэтому закрывайте модалку, прежде чем показать
|
|
444
|
+
уведомление. `class` и атрибуты попадают на корень на весь экран, так что
|
|
445
|
+
страница может поднять его своим классом, например `class="z-30"`.
|
|
446
|
+
|
|
432
447
|
## Языки
|
|
433
448
|
|
|
434
449
|
Тексты пакета есть на русском и английском. Язык компонента — проп `lang`, если
|
|
@@ -445,6 +460,7 @@ sm:rounded-lg`, `box-sizing: border-box`. Отступов у неё нет: ф
|
|
|
445
460
|
| `SelectDateInterval` — подсказки полей | от / до | from / to |
|
|
446
461
|
| `Pagination` | Предыдущая / Следующая / Показаны результаты X - Y из Z | Previous / Next / Showing X - Y of Z results |
|
|
447
462
|
| `PageCard` — доступное имя крестика | Назад | Back |
|
|
463
|
+
| `NotificationMessage` — подпись крестика для скринридера | Закрыть | Close |
|
|
448
464
|
|
|
449
465
|
Формат даты — `дд.мм.гггг` в обоих языках: это формат значения, а не текст.
|
|
450
466
|
Неделя начинается с понедельника. Календарь `PickDay` берёт язык при
|
|
@@ -561,8 +577,11 @@ Tailwind, `@tailwindcss/forms` и типографикой, как у потре
|
|
|
561
577
|
такие обращения перестанут находить элементы: внутренние классы в контракт
|
|
562
578
|
пакета не входят.
|
|
563
579
|
|
|
580
|
+
С версии 0.10.0 `Modal` не экспортируется: это внутренняя оболочка
|
|
581
|
+
`ConfirmationModal`.
|
|
582
|
+
|
|
564
583
|
Ресет пакета распространяется и на содержимое слотов — разметку приложения
|
|
565
|
-
внутри `Popup
|
|
584
|
+
внутри `Popup` и `DropdownButtonWithAction`. Ресет лежит в слое
|
|
566
585
|
`components`, поэтому внутри слота он сильнее всего, что приложение объявило
|
|
567
586
|
в слое `base`: preflight, `@tailwindcss/forms` и собственных умолчаний
|
|
568
587
|
приложения. В слоте он задаёт:
|
|
@@ -590,6 +609,6 @@ focus:ring-offset-2`.
|
|
|
590
609
|
(`tabindex="-1"`): скринридер его не назовёт, а с клавиатуры до него не
|
|
591
610
|
добраться.
|
|
592
611
|
|
|
593
|
-
`
|
|
594
|
-
|
|
595
|
-
|
|
612
|
+
`ConfirmationModal` не переносит фокус внутрь при открытии, не удерживает его
|
|
613
|
+
внутри, не возвращает на прежнее место после закрытия и не закрывается по
|
|
614
|
+
Escape.
|