@boobooking/dashboard-ui-components 0.8.0 → 0.10.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 +118 -46
- package/dist/index.js +299 -169
- package/dist/style.css +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -48,11 +48,11 @@ Tailwind, `@tailwindcss/forms`, Inertia и какие-либо токены в C
|
|
|
48
48
|
|
|
49
49
|
## Компоненты
|
|
50
50
|
|
|
51
|
-
Пакет экспортирует
|
|
51
|
+
Пакет экспортирует семнадцать компонентов: `Popup`, `Dot`, `PickDay`,
|
|
52
52
|
`RussianMobileFilter`, `Search`, `SelectDateInterval`, `SelectSingle`,
|
|
53
|
-
`SmallBadge`, `ErrorMessages`, `Closer`, `DownloadLink`,
|
|
53
|
+
`SmallBadge`, `ErrorMessages`, `Closer`, `DownloadLink`,
|
|
54
54
|
`ConfirmationModal`, `DropdownButtonWithAction`, `Pagination`,
|
|
55
|
-
`NavigationMenuElement` и плагин `dashboardUi`. В архив пакета
|
|
55
|
+
`NavigationMenuElement`, `PageCard`, `NotificationMessage` и плагин `dashboardUi`. В архив пакета
|
|
56
56
|
(`files: ["dist"]`) исходники не
|
|
57
57
|
попадают, поэтому контракт каждого компонента — здесь и в playground, а не в
|
|
58
58
|
исходном коде.
|
|
@@ -250,44 +250,6 @@ Tailwind, `@tailwindcss/forms`, Inertia и какие-либо токены в C
|
|
|
250
250
|
|
|
251
251
|
Событий нет.
|
|
252
252
|
|
|
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
253
|
### ConfirmationModal
|
|
292
254
|
|
|
293
255
|
Модалка подтверждения действия: заголовок, текст, кнопка действия и кнопка
|
|
@@ -317,6 +279,13 @@ Escape: видимостью управляет родитель, как у `Con
|
|
|
317
279
|
отмены. Ни одна из кнопок модалку не закрывает — см. раздел «Почему у
|
|
318
280
|
ConfirmationModal нет v-model».
|
|
319
281
|
|
|
282
|
+
Панель модалки — белая, со скруглением `rounded-lg`: на узком экране прижата
|
|
283
|
+
к нижнему краю, начиная с `sm` стоит по центру и занимает `max-w-lg`. `class` и
|
|
284
|
+
другие атрибуты на `<confirmation-modal>` попадают на полноэкранный корень, а
|
|
285
|
+
не на панель. Панель не обрезает содержимое, поэтому блоки текста и кнопок со
|
|
286
|
+
своим фоном скругляют внешние углы сами — верхний `rounded-t-lg`, нижний
|
|
287
|
+
`rounded-b-lg`.
|
|
288
|
+
|
|
320
289
|
### DropdownButtonWithAction
|
|
321
290
|
|
|
322
291
|
Кнопка с меню дополнительных действий: основная часть — слот `button`, стрелка
|
|
@@ -371,6 +340,105 @@ ConfirmationModal нет v-model».
|
|
|
371
340
|
|
|
372
341
|
Ссылка — через `navigate` плагина. Событий нет.
|
|
373
342
|
|
|
343
|
+
### PageCard
|
|
344
|
+
|
|
345
|
+
Карточка отдельной страницы — формы или просмотра записи — по центру с
|
|
346
|
+
крестиком «назад по истории».
|
|
347
|
+
|
|
348
|
+
<page-card class="px-4 pt-4 sm:px-6 sm:pt-6">
|
|
349
|
+
<h3 class="pr-(--bb-closer-space) text-lg font-medium">Создание администратора</h3>
|
|
350
|
+
…поля формы…
|
|
351
|
+
</page-card>
|
|
352
|
+
|
|
353
|
+
Страница просмотра, у секций которой свои отступы:
|
|
354
|
+
|
|
355
|
+
<page-card>
|
|
356
|
+
<div class="px-4 py-5 border-b border-gray-200 sm:px-6">
|
|
357
|
+
<h3 class="pr-(--bb-closer-space) text-lg font-medium">{{ name }}</h3>
|
|
358
|
+
</div>
|
|
359
|
+
<div class="overflow-hidden sm:rounded-b-lg">…строки…</div>
|
|
360
|
+
</page-card>
|
|
361
|
+
|
|
362
|
+
Карточка — `relative my-6 mx-auto bg-white shadow-xl sm:max-w-xl
|
|
363
|
+
sm:rounded-lg`, `box-sizing: border-box`. Отступов у неё нет: форма передаёт
|
|
364
|
+
их классом на корень, страница просмотра — не передаёт. Классы и атрибуты
|
|
365
|
+
приложения попадают на корень и сильнее классов пакета. Ресет пакета на
|
|
366
|
+
карточку и её содержимое не распространяется: разметка страницы, в том числе
|
|
367
|
+
поля `@tailwindcss/forms`, выглядит так же, как вне карточки.
|
|
368
|
+
|
|
369
|
+
Крестик показан, если в истории вкладки больше одной записи
|
|
370
|
+
(`history.length > 1`, значение читается при создании компонента), и по клику
|
|
371
|
+
возвращает назад (`history.back()`). `PageCard` читает историю браузера при
|
|
372
|
+
создании компонента, поэтому ему нужен браузер: серверный рендеринг (SSR) не
|
|
373
|
+
поддерживается. `history.length` считает и записи впереди
|
|
374
|
+
текущей, поэтому это не гарантия, что назад есть куда. От `md` крестик стоит
|
|
375
|
+
снаружи карточки, на `1rem` правее её края; ниже `md` — в её правом верхнем
|
|
376
|
+
углу. Порог рассчитан на карточку по центру области на всю ширину страницы: в
|
|
377
|
+
узкой колонке или рядом с боковой панелью места снаружи может не хватить. Он
|
|
378
|
+
рассчитан и на ширину карточки по умолчанию (`max-w-xl`, 36rem): если передать
|
|
379
|
+
классом на корень более широкую, места снаружи тоже может не хватить.
|
|
380
|
+
|
|
381
|
+
Заголовок оставляет место под крестик правым отступом из переменной
|
|
382
|
+
`--bb-closer-space`: `3.5rem`, пока крестик в углу, `0` — когда он снаружи или
|
|
383
|
+
его нет. В Tailwind это `pr-(--bb-closer-space)`; без Tailwind 4 — обычный CSS
|
|
384
|
+
`padding-right: var(--bb-closer-space)`, а в Tailwind 3 —
|
|
385
|
+
`pr-[var(--bb-closer-space)]`. Вне `PageCard` отступ равен нулю.
|
|
386
|
+
|
|
387
|
+
Карточка не обрезает содержимое, как у `ConfirmationModal`: выпадающие списки и календари
|
|
388
|
+
могут выходить за её край. Блок со своим фоном у края карточки скругляет свои
|
|
389
|
+
углы сам — например, нижний блок строк: `overflow-hidden sm:rounded-b-lg`.
|
|
390
|
+
|
|
391
|
+
Крестик доступен с клавиатуры: Tab, Enter, пробел; в порядке табуляции крестик
|
|
392
|
+
идёт после содержимого карточки; при фокусе с клавиатуры
|
|
393
|
+
вокруг него кольцо. Доступное имя — «Назад» / «Back».
|
|
394
|
+
|
|
395
|
+
| Проп | Тип | По умолчанию | Описание |
|
|
396
|
+
| --- | --- | --- | --- |
|
|
397
|
+
| `lang` | `String` | язык плагина | `"ru"` или `"en"` |
|
|
398
|
+
|
|
399
|
+
Событий нет.
|
|
400
|
+
|
|
401
|
+
### NotificationMessage
|
|
402
|
+
|
|
403
|
+
Всплывающее уведомление: заголовок, текст, иконка по типу и крестик закрытия.
|
|
404
|
+
На узком экране стоит снизу по центру, начиная с `sm` — в правом верхнем углу.
|
|
405
|
+
|
|
406
|
+
<notification-message
|
|
407
|
+
v-model="message"
|
|
408
|
+
type="confirmation"
|
|
409
|
+
notification-heading="Письмо отправлено"
|
|
410
|
+
/>
|
|
411
|
+
|
|
412
|
+
| Проп | Тип | По умолчанию | Описание |
|
|
413
|
+
| --- | --- | --- | --- |
|
|
414
|
+
| `modelValue` | `String` | `""` | Текст уведомления; пустая строка или `null` — уведомления нет |
|
|
415
|
+
| `type` | `String` | `"warning"` | `"confirmation"` (галочка, серый фон), `"warning"` (жёлтое) или `"dangerous"` (красное) |
|
|
416
|
+
| `notificationHeading` | `String` | `""` | Заголовок |
|
|
417
|
+
| `lang` | `String` | язык плагина | `"ru"` или `"en"` |
|
|
418
|
+
|
|
419
|
+
Уведомление показано, пока текст непуст. Крестик закрывает его сам — эмитит
|
|
420
|
+
`update:modelValue` с пустой строкой, поэтому странице достаточно `v-model`.
|
|
421
|
+
Других событий нет.
|
|
422
|
+
|
|
423
|
+
Для скринридера уведомление — живая область: `role="alert"` у `dangerous`,
|
|
424
|
+
`role="status"` у остальных. Область есть на странице всегда, а пустая
|
|
425
|
+
невидима и не перехватывает клики. Скринридер объявляет текст, который
|
|
426
|
+
появился после монтирования компонента; текст, уже стоявший при монтировании,
|
|
427
|
+
может остаться необъявленным. Роль задаётся типом, поэтому `type` стоит менять
|
|
428
|
+
только пока текст пуст — проще всего держать по экземпляру на каждый тип.
|
|
429
|
+
Показывайте одно уведомление за раз: все они стоят в одном углу. Подпись
|
|
430
|
+
крестика для скринридера — «Закрыть» / «Close». После закрытия с клавиатуры
|
|
431
|
+
фокус не возвращается и уходит на `body` страницы.
|
|
432
|
+
|
|
433
|
+
Корень — на весь экран (`fixed inset-0`), с ресетом пакета; слотов нет.
|
|
434
|
+
|
|
435
|
+
У корня нет `z-index`, поэтому среди позиционированных элементов он рисуется в
|
|
436
|
+
порядке DOM: ставьте компонент в разметке страницы последним. Под открытой
|
|
437
|
+
модалкой или выпадающим меню пакета (их подложки — `z-20`) уведомление скрыто,
|
|
438
|
+
а его крестик не нажимается, поэтому закрывайте модалку, прежде чем показать
|
|
439
|
+
уведомление. `class` и атрибуты попадают на корень на весь экран, так что
|
|
440
|
+
страница может поднять его своим классом, например `class="z-30"`.
|
|
441
|
+
|
|
374
442
|
## Языки
|
|
375
443
|
|
|
376
444
|
Тексты пакета есть на русском и английском. Язык компонента — проп `lang`, если
|
|
@@ -386,6 +454,8 @@ ConfirmationModal нет v-model».
|
|
|
386
454
|
| `PickDay` — месяцы, дни недели, кнопки календаря | по-русски | in English |
|
|
387
455
|
| `SelectDateInterval` — подсказки полей | от / до | from / to |
|
|
388
456
|
| `Pagination` | Предыдущая / Следующая / Показаны результаты X - Y из Z | Previous / Next / Showing X - Y of Z results |
|
|
457
|
+
| `PageCard` — доступное имя крестика | Назад | Back |
|
|
458
|
+
| `NotificationMessage` — подпись крестика для скринридера | Закрыть | Close |
|
|
389
459
|
|
|
390
460
|
Формат даты — `дд.мм.гггг` в обоих языках: это формат значения, а не текст.
|
|
391
461
|
Неделя начинается с понедельника. Календарь `PickDay` берёт язык при
|
|
@@ -464,7 +534,7 @@ ConfirmationModal нет v-model».
|
|
|
464
534
|
|
|
465
535
|
npm run playground
|
|
466
536
|
|
|
467
|
-
Поднимает демо-страницы со всеми
|
|
537
|
+
Поднимает демо-страницы со всеми семнадцатью компонентами в двух окружениях:
|
|
468
538
|
голом (без Tailwind и стилей приложения) и в окружении приложения (с
|
|
469
539
|
Tailwind, `@tailwindcss/forms` и типографикой, как у потребителя). Это
|
|
470
540
|
основной способ посмотреть, как компоненты выглядят и ведут себя, а не
|
|
@@ -502,8 +572,10 @@ Tailwind, `@tailwindcss/forms` и типографикой, как у потре
|
|
|
502
572
|
такие обращения перестанут находить элементы: внутренние классы в контракт
|
|
503
573
|
пакета не входят.
|
|
504
574
|
|
|
575
|
+
С версии 0.10.0 `Modal` не экспортируется: это внутренняя оболочка `ConfirmationModal`.
|
|
576
|
+
|
|
505
577
|
Ресет пакета распространяется и на содержимое слотов — разметку приложения
|
|
506
|
-
внутри `Popup
|
|
578
|
+
внутри `Popup` и `DropdownButtonWithAction`. Ресет лежит в слое
|
|
507
579
|
`components`, поэтому внутри слота он сильнее всего, что приложение объявило
|
|
508
580
|
в слое `base`: preflight, `@tailwindcss/forms` и собственных умолчаний
|
|
509
581
|
приложения. В слоте он задаёт:
|
|
@@ -531,6 +603,6 @@ focus:ring-offset-2`.
|
|
|
531
603
|
(`tabindex="-1"`): скринридер его не назовёт, а с клавиатуры до него не
|
|
532
604
|
добраться.
|
|
533
605
|
|
|
534
|
-
`
|
|
535
|
-
|
|
536
|
-
|
|
606
|
+
`ConfirmationModal` не переносит фокус внутрь при открытии, не удерживает его
|
|
607
|
+
внутри, не возвращает на прежнее место после закрытия и не закрывается по
|
|
608
|
+
Escape.
|