@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 CHANGED
@@ -48,11 +48,11 @@ Tailwind, `@tailwindcss/forms`, Inertia и какие-либо токены в C
48
48
 
49
49
  ## Компоненты
50
50
 
51
- Пакет экспортирует шестнадцать компонентов: `Popup`, `Dot`, `PickDay`,
51
+ Пакет экспортирует семнадцать компонентов: `Popup`, `Dot`, `PickDay`,
52
52
  `RussianMobileFilter`, `Search`, `SelectDateInterval`, `SelectSingle`,
53
- `SmallBadge`, `ErrorMessages`, `Closer`, `DownloadLink`, `Modal`,
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`, `DropdownButtonWithAction` и `Modal`. Ресет лежит в слое
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
- `Modal` и построенный на нём `ConfirmationModal` не переносят фокус внутрь при
535
- открытии, не удерживают его внутри, не возвращают на прежнее место после
536
- закрытия и не закрываются по Escape.
606
+ `ConfirmationModal` не переносит фокус внутрь при открытии, не удерживает его
607
+ внутри, не возвращает на прежнее место после закрытия и не закрывается по
608
+ Escape.