@boobooking/dashboard-ui-components 0.16.3 → 0.17.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 CHANGED
@@ -90,12 +90,12 @@ Tailwind, `@tailwindcss/forms`, Inertia и какие-либо токены в C
90
90
 
91
91
  ## Компоненты
92
92
 
93
- Пакет экспортирует шестнадцать компонентов: `Dot`, `RussianMobileFilter`,
93
+ Пакет экспортирует семнадцать компонентов: `Dot`, `RussianMobileFilter`,
94
94
  `Search`, `SelectDateInterval`, `SelectSingle`, `InfoPill`,
95
95
  `ErrorMessages`, `ActionPill`, `ConfirmationModal`,
96
96
  `DropdownButtonWithAction`, `HamburgerMenu`, `DataTable`,
97
- `NavigationMenuElement`, `PageCard`, `NotificationMessage`, `TextPopover`,
98
- функцию `downloadFile` и плагин `dashboardUi`. В архив пакета
97
+ `NavigationMenuElement`, `PageTabs`, `PageCard`, `NotificationMessage`,
98
+ `TextPopover`, функцию `downloadFile` и плагин `dashboardUi`. В архив пакета
99
99
  (`files: ["dist"]`) исходники не попадают, поэтому контракт каждого
100
100
  компонента — здесь и в playground, а не в исходном коде.
101
101
 
@@ -396,15 +396,21 @@ exportOrders() {
396
396
  | `lang` | `String` | язык плагина | `"ru"` или `"en"` |
397
397
 
398
398
  События: `actionConfirmed` — по кнопке действия, `actionCanceled` — по кнопке
399
- отмены. Ни одна из кнопок модалку не закрывает — см. раздел «Почему у
400
- ConfirmationModal нет v-model».
401
-
402
- Панель модалки — белая, со скруглением `rounded-lg`: на узком экране прижата
403
- к нижнему краю, начиная с `sm` стоит по центру и занимает `max-w-lg`. `class` и
404
- другие атрибуты на `<confirmation-modal>` попадают на полноэкранный корень, а
405
- не на панель. Панель не обрезает содержимое, поэтому блоки текста и кнопок со
406
- своим фоном скругляют внешние углы сами — верхний `rounded-t-lg`, нижний
407
- `rounded-b-lg`.
399
+ отмены и по Escape. Ни одна из кнопок модалку не закрывает — см. раздел
400
+ «Почему у ConfirmationModal нет v-model».
401
+
402
+ Панель модалки — белая, со скруглением `rounded-lg`, стоит по центру и
403
+ занимает `max-w-lg`. `class` и другие атрибуты на `<confirmation-modal>`
404
+ попадают на полноэкранный корень, а не на панель. Панель не обрезает
405
+ содержимое, поэтому блоки текста и кнопок со своим фоном скругляют внешние
406
+ углы сами — верхний `rounded-t-lg`, нижний `rounded-b-lg`.
407
+
408
+ Открытая модалка держит фокус: в первом кадре после открытия он встаёт на
409
+ кнопку отмены, Tab и Shift+Tab ходят по её кнопкам по кругу, Escape —
410
+ `actionCanceled`, как кнопка отмены. После закрытия фокус возвращается туда,
411
+ где был до открытия, если страница не поставила его в другое место и тот
412
+ элемент ещё на странице. Кадр нужен модалкам, которые открывает пункт меню:
413
+ меню закрывается позже в том же клике и возвращает фокус на свою кнопку.
408
414
 
409
415
  ### DropdownButtonWithAction
410
416
 
@@ -621,12 +627,39 @@ Escape, клик по пункту, прокрутка и изменение р
621
627
 
622
628
  Ссылка — через `navigate` плагина. Событий нет.
623
629
 
630
+ ### PageTabs
631
+
632
+ Табы второго уровня: ссылки на страницы одного раздела под шапкой —
633
+ «Активные / Архив», «Ордера / Сертификаты / Sms».
634
+
635
+ <page-tabs :tabs="tabs" :active-key="activeTab" />
636
+
637
+ tabs() {
638
+ return [
639
+ { key: 'active', name: 'Активные', url: route('events') },
640
+ { key: 'archive', name: 'Архив', url: route('archive') },
641
+ ];
642
+ },
643
+
644
+ | Проп | Тип | По умолчанию | Описание |
645
+ | --- | --- | --- | --- |
646
+ | `tabs` | `Array` | обязателен | `[{ key, name, url }]`: ключ, подпись и адрес таба — строки |
647
+ | `activeKey` | `String` | `null` | Ключ открытого таба |
648
+ | `lang` | `String` | язык плагина | `"ru"` или `"en"` — имя навигации для скринридера |
649
+
650
+ Ключ сравнивается с `activeKey` строго, поэтому ключи — строки. Открытый
651
+ таб выделен фоном и `aria-current="page"`; если ключа нет в списке, не
652
+ выделен ни один. Вид одинаков на любой ширине: ссылки в строку, без
653
+ переноса. Отступы вокруг и кнопки рядом — разметка страницы.
654
+
655
+ Ссылки — через `navigate` плагина. Событий нет.
656
+
624
657
  ### PageCard
625
658
 
626
659
  Карточка отдельной страницы — формы или просмотра записи — по центру
627
660
  с крестиком, который ведёт туда, откуда карточку открыли.
628
661
 
629
- <page-card class="px-4 pt-4 sm:px-6 sm:pt-6" :fallback-url="route('users')">
662
+ <page-card class="px-6 pt-6" :fallback-url="route('users')">
630
663
  <h3 class="pr-(--bb-closer-space) text-lg font-medium">Создание администратора</h3>
631
664
  …поля формы…
632
665
  </page-card>
@@ -634,10 +667,10 @@ Escape, клик по пункту, прокрутка и изменение р
634
667
  Страница просмотра, у секций которой свои отступы:
635
668
 
636
669
  <page-card :fallback-url="route('payments')">
637
- <div class="px-4 py-5 border-b border-gray-200 sm:px-6">
670
+ <div class="px-6 py-5 border-b border-gray-200">
638
671
  <h3 class="pr-(--bb-closer-space) text-lg font-medium">{{ name }}</h3>
639
672
  </div>
640
- <div class="overflow-hidden sm:rounded-b-lg">…строки…</div>
673
+ <div class="overflow-hidden rounded-b-lg">…строки…</div>
641
674
  </page-card>
642
675
 
643
676
  **Куда ведёт крестик.** Плагин `dashboardUi` с `currentUrl` (см.
@@ -667,7 +700,7 @@ Inertia с общим ключом окна:
667
700
  width: '7xl',
668
701
  windowKey: `group:${props.group.data.uuid}`,
669
702
  fallbackUrl: route('groups'),
670
- class: 'px-4 py-4 sm:px-6 sm:py-6',
703
+ class: 'px-6 py-6',
671
704
  }],
672
705
  }
673
706
 
@@ -699,7 +732,7 @@ Inertia с общим ключом окна:
699
732
  которого крестик стоит снаружи, на `1rem` правее её края; ниже порога —
700
733
  в правом верхнем углу:
701
734
 
702
- | `width` | Ширина от `sm` | Крестик снаружи |
735
+ | `width` | Ширина | Крестик снаружи |
703
736
  | --- | --- | --- |
704
737
  | `xl` (по умолчанию) | `max-w-xl` (36rem) | от `md` |
705
738
  | `4xl` | `max-w-4xl` (56rem) | от `lg` |
@@ -716,7 +749,7 @@ Inertia с общим ключом окна:
716
749
  `pr-[var(--bb-closer-space)]`. Вне `PageCard` отступ равен нулю.
717
750
 
718
751
  **Атрибуты.** Карточка — `relative my-6 mx-auto bg-white shadow-xl
719
- sm:rounded-lg`, `box-sizing: border-box`. Отступов у неё нет: форма
752
+ rounded-lg`, `box-sizing: border-box`. Отступов у неё нет: форма
720
753
  передаёт их классом на корень, страница просмотра — не передаёт. На корень
721
754
  попадают `class`, `style`, `data-*` и `aria-*` приложения; классы
722
755
  приложения сильнее классов пакета. Остальные атрибуты, в том числе `id`,
@@ -730,7 +763,7 @@ sm:rounded-lg`, `box-sizing: border-box`. Отступов у неё нет: ф
730
763
  Карточка не обрезает содержимое, как у `ConfirmationModal`: выпадающие
731
764
  списки и календари могут выходить за её край. Блок со своим фоном у края
732
765
  карточки скругляет свои углы сам — например, нижний блок строк:
733
- `overflow-hidden sm:rounded-b-lg`.
766
+ `overflow-hidden rounded-b-lg`.
734
767
 
735
768
  Крестик доступен с клавиатуры: Tab, Enter, пробел; в порядке табуляции
736
769
  крестик идёт после содержимого карточки; при фокусе с клавиатуры вокруг
@@ -758,7 +791,7 @@ sm:rounded-lg`, `box-sizing: border-box`. Отступов у неё нет: ф
758
791
  ### NotificationMessage
759
792
 
760
793
  Всплывающее уведомление: заголовок, текст, иконка по типу и крестик закрытия.
761
- На узком экране стоит снизу по центру, начиная с `sm` — в правом верхнем углу.
794
+ Стоит в правом верхнем углу.
762
795
 
763
796
  <notification-message
764
797
  v-model="message"
@@ -835,6 +868,7 @@ sm:rounded-lg`, `box-sizing: border-box`. Отступов у неё нет: ф
835
868
  | `SelectDateInterval` — подсказки полей | от / до | from / to |
836
869
  | Ластик `Search`, `RussianMobileFilter`, `SelectSingle` (язык плагина) и `SelectDateInterval` — подпись для скринридера | Очистить | Clear |
837
870
  | `DataTable` — пагинация | Предыдущая / Следующая / Показаны результаты X - Y из Z | Previous / Next / Showing X - Y of Z results |
871
+ | `PageTabs` — имя навигации для скринридера | Закладки | Tabs |
838
872
  | `PageCard` — доступное имя крестика | Назад | Back |
839
873
  | `NotificationMessage` — подпись крестика для скринридера | Закрыть | Close |
840
874
  | `TextPopover` — подпись кнопки и имя области | Показать текст / Полный текст | Show text / Full text |
@@ -919,8 +953,8 @@ Inertia SSR), а серверная разметка гидратируется
919
953
  - Ссылка компонента — настоящий `<a href>`; обычный клик — через
920
954
  `followLink($event, href)` миксина `withNavigation`, который отдаёт его
921
955
  `navigate` плагина. Ни Inertia, ни роутер пакет не импортирует. Через `navigate` ходят
922
- `DataTable` (его пагинация), `NavigationMenuElement`, основная
923
- кнопка-переход и пункты-переходы `DropdownButtonWithAction` и
956
+ `DataTable` (его пагинация), `NavigationMenuElement`, `PageTabs`,
957
+ основная кнопка-переход и пункты-переходы `DropdownButtonWithAction` и
924
958
  пункты-переходы `HamburgerMenu`. Крестик `PageCard` — кнопка, а не ссылка:
925
959
  адрес возврата он тоже отдаёт `navigate`.
926
960
  - Компонент обращается к `window`, `document` и другим API браузера только
@@ -929,6 +963,11 @@ Inertia SSR), а серверная разметка гидратируется
929
963
  загружается и рендерится на сервере (см. «SSR»). Правило проверяют
930
964
  `tests/ssr.test.js` и `tests/hydration.test.js`: каждый экспортируемый
931
965
  компонент обязан иметь фикстуру в `tests/ssrFixtures.js`.
966
+ - Мобильных вариантов у компонентов нет: дашборды работают на десктопе,
967
+ и компонент на любой ширине выглядит так, как на десктопе. Порог ширины
968
+ (`bb:sm:`, `bb:md:`, …) ставится, только если без него компонент
969
+ не помещается в узкое окно десктопа, — как у крестика `PageCard`,
970
+ который от порога выходит за край карточки.
932
971
 
933
972
  ## Почему у Dot нет события changed
934
973
 
@@ -946,18 +985,28 @@ Inertia SSR), а серверная разметка гидратируется
946
985
  Правило пакета — значение через `v-model` — относится к состоянию, которое
947
986
  компонент меняет сам: меню `DropdownButtonWithAction` закрывается по клику
948
987
  вне, `SelectSingle` меняет выбор. `ConfirmationModal` свою видимость не меняет
949
- никогда. Обе кнопки только сообщают родителю решение пользователя, а закрыть
950
- модалку, оставить её открытой на время запроса или открыть следующую — решает
951
- родитель.
988
+ никогда. Обе кнопки и Escape только сообщают родителю решение пользователя,
989
+ а закрыть модалку, оставить её открытой на время запроса или открыть
990
+ следующую — решает родитель.
952
991
 
953
992
  `v-model` обещал бы двустороннюю связь, которой нет, поэтому видимость
954
993
  передаётся пропом `isOpen`.
955
994
 
995
+ ## Почему у PageTabs нет v-model
996
+
997
+ Открытый таб `PageTabs` сам не меняет: клик по ссылке ведёт на другую
998
+ страницу, и открытый таб приносит она — пропом `activeKey`. Пока новая
999
+ страница не пришла, выделен прежний таб, как у пунктов шапки
1000
+ `NavigationMenuElement`.
1001
+
1002
+ `v-model` обещал бы, что компонент меняет значение сам, поэтому открытый
1003
+ таб передаётся пропом `activeKey`.
1004
+
956
1005
  ## Playground
957
1006
 
958
1007
  npm run playground
959
1008
 
960
- Поднимает демо-страницы со всеми шестнадцатью компонентами в двух окружениях:
1009
+ Поднимает демо-страницы со всеми семнадцатью компонентами в двух окружениях:
961
1010
  голом (без Tailwind и стилей приложения) и в окружении приложения (с
962
1011
  Tailwind, `@tailwindcss/forms` и типографикой, как у потребителя). Это
963
1012
  основной способ посмотреть, как компоненты выглядят и ведут себя, а не
@@ -1258,7 +1307,3 @@ exportOrders() {
1258
1307
  Например, чекбоксу: `border border-gray-300 bg-white text-indigo-600
1259
1308
  checked:bg-current checked:border-transparent focus:ring-2
1260
1309
  focus:ring-offset-2`.
1261
-
1262
- `ConfirmationModal` не переносит фокус внутрь при открытии, не удерживает его
1263
- внутри, не возвращает на прежнее место после закрытия и не закрывается по
1264
- Escape.