@boobooking/dashboard-ui-components 0.15.1 → 0.16.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
@@ -65,31 +65,57 @@ Vue не ниже 3.5, ESM, сборщик, умеющий импорт CSS из
65
65
  Tailwind, `@tailwindcss/forms`, Inertia и какие-либо токены в CSS приложения
66
66
  пакету не нужны.
67
67
 
68
- Меню `DropdownButtonWithAction` и `HamburgerMenu`, список `SelectSingle` и
69
- календари `SelectDateInterval` стоят на Popover API браузера: Safari 17+,
70
- Chrome 114+, Firefox 125+. В браузерах старше меню, список и календари
71
- видны в потоке всегда.
68
+ Меню `DropdownButtonWithAction` и `HamburgerMenu`, список `SelectSingle`,
69
+ календари `SelectDateInterval` и подсказка `TextPopover` стоят на Popover API
70
+ браузера: Safari 17+, Chrome 114+, Firefox 125+. В браузерах старше меню,
71
+ список, календари и подсказка видны в потоке всегда.
72
+
73
+ ## Цвета
74
+
75
+ У пакета один список цветов, и все компоненты с цветом берут его:
76
+ `gray`, `green`, `yellow`, `red`, `indigo`, `purple`. Цвет передаётся
77
+ именем; другое имя валидатор отклоняет, а компонент рисуется без цвета.
78
+ Смысл цвета — какой статус зелёный — задаёт проект своей картой
79
+ «значение → имя».
80
+
81
+ | Где | Вид цвета `<тон>` |
82
+ | --- | --- |
83
+ | `InfoPill`, `ActionPill` | фон `-100`, текст `-800`; у `ActionPill` при наведении текст `-600` |
84
+ | основная кнопка и стрелка `DropdownButtonWithAction` | фон `-100`, рамка `-300`, текст `-800`, при наведении фон `-200` |
85
+ | пункт меню `DropdownButtonWithAction` и `HamburgerMenu` | текст `-800`, в фокусе фон `-100` |
86
+ | `Dot`, полоска строки `DataTable` | `-500` |
87
+
88
+ Без цвета кнопка белая с серой рамкой, пункт меню серый, строка таблицы без
89
+ полоски — это вид компонента по умолчанию, в список он не входит.
72
90
 
73
91
  ## Компоненты
74
92
 
75
- Пакет экспортирует пятнадцать компонентов: `Dot`, `RussianMobileFilter`,
76
- `Search`, `SelectDateInterval`, `SelectSingle`, `SmallBadge`,
77
- `ErrorMessages`, `DownloadLink`, `ConfirmationModal`,
93
+ Пакет экспортирует шестнадцать компонентов: `Dot`, `RussianMobileFilter`,
94
+ `Search`, `SelectDateInterval`, `SelectSingle`, `InfoPill`,
95
+ `ErrorMessages`, `ActionPill`, `ConfirmationModal`,
78
96
  `DropdownButtonWithAction`, `HamburgerMenu`, `DataTable`,
79
- `NavigationMenuElement`, `PageCard`, `NotificationMessage` и плагин
80
- `dashboardUi`. В архив пакета (`files: ["dist"]`) исходники не попадают,
81
- поэтому контракт каждого компонента — здесь и в playground, а не в исходном
82
- коде.
97
+ `NavigationMenuElement`, `PageCard`, `NotificationMessage`, `TextPopover`,
98
+ функцию `downloadFile` и плагин `dashboardUi`. В архив пакета
99
+ (`files: ["dist"]`) исходники не попадают, поэтому контракт каждого
100
+ компонента — здесь и в playground, а не в исходном коде.
101
+
102
+ Крестики — закрытие `PageCard` и ластики очистки фильтров — при нажатии
103
+ коротко «вдавливаются», и действие выполняется после этого, через 150 мс:
104
+ иначе нажатия не было бы видно — ластик пропадает сразу после очистки,
105
+ крестик уводит со страницы. Так при любом нажатии: мышью, касанием,
106
+ Enter, пробелом, расширением клавиатурной навигации. Нажатия во время
107
+ анимации не считаются: одно нажатие — одно действие. При «уменьшении
108
+ движения» в системе — без анимации и сразу.
83
109
 
84
110
  ### Dot
85
111
 
86
- Индикатор-точка: красная или зелёная, с пульсацией или без.
112
+ Индикатор-точка любого цвета из списка, с пульсацией или без.
87
113
 
88
114
  <dot color="green" :with-pulse="isLive" />
89
115
 
90
116
  | Проп | Тип | По умолчанию | Описание |
91
117
  | --- | --- | --- | --- |
92
- | `color` | `String` | обязателен | `"red"` или `"green"` |
118
+ | `color` | `String` | обязателен | Имя из списка цветов (раздел «Цвета») |
93
119
  | `withPulse` | `Boolean` | `false` | Добавляет анимацию пульсации |
94
120
 
95
121
  Событий нет. Значения у `Dot` тоже нет — см. раздел
@@ -178,6 +204,14 @@ Chrome 114+, Firefox 125+. В браузерах старше меню, спис
178
204
  под курсором, поэтому календарь «до» открывается тем же кликом, что
179
205
  закрывает «от».
180
206
 
207
+ С клавиатуры: Enter или пробел на поле открывают календарь. Пока он открыт,
208
+ стрелки переводят фокус по дням: влево и вправо — на день, вверх и вниз — на
209
+ неделю; с края месяца календарь листается, дата при этом не выбирается.
210
+ Первая стрелка ставит фокус на выбранный день, без выбранного — на сегодня.
211
+ Enter или пробел выбирают день под фокусом и стрелки месяцев — так же, как
212
+ клик; Escape закрывает календарь. После закрытия фокус возвращается на поле.
213
+ В поле можно перейти Tab и набрать дату.
214
+
181
215
  ### SelectSingle
182
216
 
183
217
  <select-single
@@ -224,16 +258,17 @@ Chrome 114+, Firefox 125+. В браузерах старше меню, спис
224
258
  внутри списка — нет. Открытие другого списка, календаря или меню
225
259
  закрывает предыдущее.
226
260
 
227
- ### SmallBadge
261
+ ### InfoPill
228
262
 
229
- Бейдж-пилюля с коротким текстом. Текст не переносится.
263
+ Пилюля, которая только показывает текст: статус, счётчик, флаг, пометку.
264
+ Текст не переносится.
230
265
 
231
- <small-badge text="Отправлено" color="green" />
266
+ <info-pill text="доставлено" color="green" />
232
267
 
233
268
  | Проп | Тип | По умолчанию | Описание |
234
269
  | --- | --- | --- | --- |
235
- | `text` | `String` | обязателен | Текст бейджа |
236
- | `color` | `String` | обязателен | `"green"`, `"indigo"`, `"gray"`, `"blue"`, `"red"` или `"yellow"` |
270
+ | `text` | `String` | обязателен | Текст пилюли |
271
+ | `color` | `String` | обязателен | Имя из списка цветов |
237
272
 
238
273
  Событий нет.
239
274
 
@@ -251,19 +286,60 @@ Chrome 114+, Firefox 125+. В браузерах старше меню, спис
251
286
 
252
287
  Событий нет.
253
288
 
254
- ### DownloadLink
289
+ ### ActionPill
255
290
 
256
- Ссылка на файл в виде бейджа с иконкой скачивания. Кликабелен весь бейдж.
291
+ Пилюля, которой запускают действие: скачать отчёт, запросить статусы. Что
292
+ делает действие, пилюля не знает — страница слушает `click` и сама передаёт
293
+ `isLoading`, пока действие идёт.
257
294
 
258
- <download-link :url="exportUrl" title="скачать xlsx" />
295
+ <action-pill
296
+ icon="download"
297
+ title="скачать xlsx"
298
+ loading-text="формируется отчёт"
299
+ :is-loading="exportLoading"
300
+ @click="exportOrders"
301
+ />
259
302
 
260
303
  | Проп | Тип | По умолчанию | Описание |
261
304
  | --- | --- | --- | --- |
262
- | `url` | `String` | обязателен | Адрес файла |
263
- | `title` | `String` | `null` | Подпись и всплывающая подсказка; без него — «Скачать» / «Download» по языку |
264
- | `lang` | `String` | язык плагина | `"ru"` или `"en"` |
305
+ | `title` | `String` | обязателен | Подпись и всплывающая подсказка |
306
+ | `icon` | `String` | обязателен | `"download"` или `"refresh"` |
307
+ | `color` | `String` | `"purple"` | Имя из списка цветов |
308
+ | `isLoading` | `Boolean` | `false` | Идёт работа |
309
+ | `loadingText` | `String` | `null` | Подпись на время работы; без неё остаётся `title` |
265
310
 
266
- Событий нет.
311
+ Событие: `click` без аргументов.
312
+
313
+ Пока идёт работа, пилюля погашена и недоступна — второй клик не проходит,
314
+ вместо иконки бегут стрелки часов, подпись — `loadingText`. При системной
315
+ настройке «уменьшить движение» стрелки стоят. Иконки пакета — `download`
316
+ и `refresh`; новое действие с новой иконкой — новая иконка в пакете.
317
+
318
+ ### downloadFile
319
+
320
+ Функция: скачивает файл запросом и отдаёт его браузеру. Страница знает,
321
+ когда файл пришёл, — так показывается работа на `ActionPill`.
322
+
323
+ ```js
324
+ import { downloadFile } from '@boobooking/dashboard-ui-components'
325
+
326
+ exportOrders() {
327
+ this.exportLoading = true;
328
+ downloadFile(this.exportUrl)
329
+ .catch(() => { this.exportFailure = "Попробуйте ещё раз"; })
330
+ .finally(() => { this.exportLoading = false; });
331
+ }
332
+ ```
333
+
334
+ - Запрос — `GET` с cookie сессии (`credentials: 'same-origin'`).
335
+ - Promise отклоняется: при ответе не `2xx` (код в тексте ошибки), при
336
+ перенаправлении — обычно на страницу входа после истёкшей сессии — и при
337
+ сетевой ошибке.
338
+ - Имя файла — из `Content-Disposition` (`filename*=UTF-8''…`, затем
339
+ `filename`), без него — последний сегмент пути адреса, без пути —
340
+ `download`.
341
+ - Таймаута нет; уход со страницы скачивание не прерывает. Файл до
342
+ сохранения целиком в памяти вкладки.
267
343
 
268
344
  ### ConfirmationModal
269
345
 
@@ -331,7 +407,7 @@ ConfirmationModal нет v-model».
331
407
  | `label` | `String`, обязательно | Текст кнопки или пункта меню |
332
408
  | `href` | `String` | Переход: обычный клик уходит в `navigate` плагина `dashboardUi`, клик с Cmd/Ctrl/Shift и средней кнопкой — браузеру; без `navigate` — обычная ссылка |
333
409
  | `onSelect` | `Function` | Действие: вызывается без аргументов |
334
- | `color` | `"yellow"` или `"red"` | Цвет; без поля — обычный |
410
+ | `color` | `String` | Имя из списка цветов; без поля — обычный |
335
411
 
336
412
  Основная кнопка работает как пункт меню: переход — ссылка, действие —
337
413
  кнопка, и `onSelect` вызывает сам компонент — по клику, Enter и пробелу.
@@ -339,10 +415,9 @@ ConfirmationModal нет v-model».
339
415
  разбираться в разметке компонента.
340
416
 
341
417
  Цвет первого действия красит основную кнопку вместе со стрелкой, цвет
342
- пункта меню — только этот пункт. Обычная кнопка — белая с серой рамкой,
343
- жёлтая и красная — светлый фон, рамка и текст своего цвета. Обычный пункт
344
- меню — серый текст, при подсветке серый фон; жёлтый и красный — текст
345
- своего цвета, при подсветке светлый фон того же цвета.
418
+ пункта меню — только этот пункт. Без цвета кнопка белая с серой рамкой,
419
+ пункт — серый текст и серый фон при подсветке; с цветом — по разделу
420
+ «Цвета».
346
421
 
347
422
  Неверный список Vue отмечает предупреждением о пропе в режиме разработки,
348
423
  а компонент не падает: элементы-необъекты пропускает, кнопка без функции
@@ -404,7 +479,7 @@ ConfirmationModal нет v-model».
404
479
 
405
480
  Пункты, их проверка и вид — как у `DropdownButtonWithAction`: переход —
406
481
  `{ label, href }`, действие — `{ label, onSelect }`, цвет —
407
- `color: 'yellow'` или `color: 'red'`. Выход запросом DELETE — действие:
482
+ `color: имя из списка цветов`. Выход запросом DELETE — действие:
408
483
  Inertia пакет не импортирует, `router.delete` вызывает страница.
409
484
 
410
485
  Событий и `v-model` нет: меню открывают и закрывают кнопка, клик вне меню,
@@ -441,10 +516,10 @@ Escape, клик по пункту, прокрутка и изменение р
441
516
  empty-text="Не найдено ордеров"
442
517
  >
443
518
  <template #results-actions>
444
- <download-link :url="exportUrl" title="скачать xlsx" />
519
+ <action-pill icon="download" title="скачать xlsx" :is-loading="exportLoading" @click="exportOrders" />
445
520
  </template>
446
521
  <template #cell-status="{ row }">
447
- <small-badge :text="row.statusLabel" :color="row.statusColor" />
522
+ <info-pill :text="row.statusLabel" :color="row.statusColor" />
448
523
  </template>
449
524
  </data-table>
450
525
 
@@ -467,7 +542,7 @@ Escape, клик по пункту, прокрутка и изменение р
467
542
  | `foundText` | `String` | `null` | «Найдено ордеров» → бейдж «Найдено ордеров: 100», когда записи есть |
468
543
  | `emptyText` | `String` | `null` | «Не найдено ордеров» — бейдж, когда записей нет |
469
544
  | `variant` | `String` | `"page"` | `"page"` — отдельная карточка с тенью; `"card"` — таблица внутри карточки страницы, только линия сверху |
470
- | `rowColor` | `Function` | `null` | `row => 'red' \| 'green' \| null` — цвет строки вместо полосатости |
545
+ | `rowStripe` | `Function` | `null` | `row => имя цвета \| null` — полоска слева в первой ячейке строки; строки полосатые всегда |
471
546
  | `lang` | `String` | язык плагина | `"ru"` или `"en"` — тексты пагинации |
472
547
 
473
548
  Столбец:
@@ -692,29 +767,78 @@ sm:rounded-lg`, `box-sizing: border-box`. Отступов у неё нет: ф
692
767
  уведомление. `class` и атрибуты попадают на корень на весь экран, так что
693
768
  страница может поднять его своим классом, например `class="z-30"`.
694
769
 
770
+ ### TextPopover
771
+
772
+ Иконка-глаз, по клику — подсказка со скрытым текстом: длинный текст SMS,
773
+ значение ключа. Пустой текст — компонента нет.
774
+
775
+ <text-popover :text="row.message" />
776
+
777
+ | Проп | Тип | По умолчанию | Описание |
778
+ | --- | --- | --- | --- |
779
+ | `text` | `String` | обязателен | Скрытый текст; `null` и `""` — компонента нет |
780
+ | `modelValue` | `Boolean` | `false` | Открыта ли подсказка; `v-model` необязателен |
781
+ | `lang` | `String` | язык плагина | `"ru"` или `"en"` |
782
+
783
+ Событие: `update:modelValue` — когда подсказка открылась или закрылась сама:
784
+ кнопкой, кликом вне, Escape, прокруткой, изменением размера окна, опустевшим
785
+ текстом. Значение, пришедшее от родителя, эхом не возвращается.
786
+
787
+ Подсказка открывается в верхнем слое браузера (Popover API): правым краем по
788
+ правому краю иконки, шириной до 384 px, вниз, если помещается, иначе туда,
789
+ где места больше; длинный текст прокручивается внутри, в том числе с
790
+ клавиатуры. Пока подсказка открыта, остальная страница не выделяется:
791
+ тройной клик и протяжка мышью выделяют только её текст. У левого края окна
792
+ подсказка сужается до места слева от иконки, как и меню.
793
+
695
794
  ## Языки
696
795
 
697
796
  Тексты пакета есть на русском и английском. Язык компонента — проп `lang`, если
698
797
  он задан, иначе язык плагина `dashboardUi`, иначе русский. Явно переданный текст
699
- главнее языка: `cancel-button-text` у `ConfirmationModal`, `title` у
700
- `DownloadLink`.
798
+ главнее языка: `cancel-button-text` у `ConfirmationModal`.
701
799
 
702
800
  | Компонент | `ru` | `en` |
703
801
  | --- | --- | --- |
704
802
  | `ConfirmationModal` — кнопка отмены | Отмена | Cancel |
705
- | `DownloadLink` — подпись | Скачать | Download |
706
803
  | `DropdownButtonWithAction` — подпись стрелки для скринридера | Открыть меню | Open menu |
707
804
  | `HamburgerMenu` — подпись кнопки для скринридера | Открыть меню | Open menu |
708
805
  | `SelectDateInterval` — месяцы, дни недели, кнопки календарей | по-русски | in English |
709
806
  | `SelectDateInterval` — подсказки полей | от / до | from / to |
807
+ | Ластик `Search`, `RussianMobileFilter`, `SelectSingle` (язык плагина) и `SelectDateInterval` — подпись для скринридера | Очистить | Clear |
710
808
  | `DataTable` — пагинация | Предыдущая / Следующая / Показаны результаты X - Y из Z | Previous / Next / Showing X - Y of Z results |
711
809
  | `PageCard` — доступное имя крестика | Назад | Back |
712
810
  | `NotificationMessage` — подпись крестика для скринридера | Закрыть | Close |
811
+ | `TextPopover` — подпись кнопки и имя области | Показать текст / Полный текст | Show text / Full text |
713
812
 
714
813
  Формат даты — `дд.мм.гггг` в обоих языках: это формат значения, а не текст.
715
814
  Неделя начинается с понедельника. Календари `SelectDateInterval` берут язык
716
815
  при монтировании: смена языка после монтирования в них не отражается.
717
816
 
817
+ ## Клавиатурная навигация
818
+
819
+ Кнопки и ссылки компонентов нажимаются расширениями клавиатурной навигации —
820
+ Vimium, Vimari, Vimlike — по их подсказкам, как мышью; подсказка у каждой
821
+ кнопки одна и стоит на всей кнопке.
822
+
823
+ Vimlike (Safari на iPhone, iPad и Mac) считает кнопкой любой элемент
824
+ с `cursor: pointer` и из вложенных таких элементов оставляет самый глубокий.
825
+ Курсор наследуется, поэтому в кнопке с курсором-рукой — своим или от правила
826
+ приложения `button:not(:disabled) { cursor: pointer }` — подсказки достались
827
+ бы тексту, иконке, у которой нет `click()`, и скрытой подписи, которую Vimlike
828
+ считает невидимой. Поэтому содержимое кнопок и ссылок пакета — текст, иконки,
829
+ скрытые подписи — с курсором `default` и не ловит указатель: мышь над ним
830
+ видит руку самой кнопки. По той же причине поле даты `SelectDateInterval`
831
+ лежит не внутри кнопки календаря, а под ней: поле внутри кнопки Vimlike
832
+ считал бы кнопкой вместо неё. В поле по-прежнему можно перейти Tab и набрать
833
+ дату.
834
+
835
+ Подсказки Vimlike в открытых меню, списке `SelectSingle` и календарях
836
+ `SelectDateInterval` не видны: Vimlike рисует их под верхним слоем браузера,
837
+ в котором открываются эти панели. Vimium выводит свои подсказки в верхний
838
+ слой, и у него такой проблемы нет. В Vimlike панель открывают подсказкой её
839
+ кнопки, а дальше выбирают стрелками и Enter: пункт списка или меню, день
840
+ календаря.
841
+
718
842
  ## SSR
719
843
 
720
844
  Пакет загружается и рендерится на сервере (серверный рендеринг, например
@@ -756,20 +880,20 @@ Inertia SSR), а серверная разметка гидратируется
756
880
  `class`, в `:class` и в пропсах `*-class` у `<transition>`; варианты идут
757
881
  после префикса: `bb:sm:inline-block`, `bb:hover:bg-red-700`. Утилита без
758
882
  префикса не сгенерируется. Классы в `:class` пишутся литералами — ключами
759
- объекта, ветками тернарного оператора, элементами массива. Оба правила
883
+ объекта, ветками тернарного оператора, элементами массива. Цветовые классы
884
+ компонент не пишет сам — берёт из `src/colors.js` вызовом
885
+ `colorClass(имя, набор)`, и эту форму тест тоже принимает. Оба правила
760
886
  проверяет `tests/utilityPrefix.test.js`.
761
887
  - Тексты интерфейса — только в `src/i18n.js`, в словарях `ru` и `en` с
762
888
  одинаковыми ключами; компонент берёт их через миксин `withLang`
763
889
  (`this.texts`) и получает проп `lang`.
764
890
  - Ссылка компонента — настоящий `<a href>`; обычный клик — через
765
891
  `followLink($event, href)` миксина `withNavigation`, который отдаёт его
766
- `navigate` плагина. Ни Inertia, ни роутер пакет не импортирует. Исключение —
767
- `DownloadLink`: это обычная ссылка браузера, скачивающая файл, и через
768
- `navigate` она не идёт. Через `navigate` ходят `DataTable` (его пагинация),
769
- `NavigationMenuElement`, основная кнопка-переход и пункты-переходы
770
- `DropdownButtonWithAction` и пункты-переходы `HamburgerMenu`. Крестик
771
- `PageCard` — кнопка, а не ссылка: адрес возврата он тоже отдаёт
772
- `navigate`.
892
+ `navigate` плагина. Ни Inertia, ни роутер пакет не импортирует. Через `navigate` ходят
893
+ `DataTable` (его пагинация), `NavigationMenuElement`, основная
894
+ кнопка-переход и пункты-переходы `DropdownButtonWithAction` и
895
+ пункты-переходы `HamburgerMenu`. Крестик `PageCard` — кнопка, а не ссылка:
896
+ адрес возврата он тоже отдаёт `navigate`.
773
897
  - Компонент обращается к `window`, `document` и другим API браузера только
774
898
  в `mounted()`, `beforeUnmount()` и обработчиках событий; загрузка модуля,
775
899
  `data()`, `computed` и рендер работают без браузера. Так пакет
@@ -804,7 +928,7 @@ Inertia SSR), а серверная разметка гидратируется
804
928
 
805
929
  npm run playground
806
930
 
807
- Поднимает демо-страницы со всеми пятнадцатью компонентами в двух окружениях:
931
+ Поднимает демо-страницы со всеми шестнадцатью компонентами в двух окружениях:
808
932
  голом (без Tailwind и стилей приложения) и в окружении приложения (с
809
933
  Tailwind, `@tailwindcss/forms` и типографикой, как у потребителя). Это
810
934
  основной способ посмотреть, как компоненты выглядят и ведут себя, а не
@@ -820,6 +944,38 @@ Tailwind, `@tailwindcss/forms` и типографикой, как у потре
820
944
  Правила номера телефона в `RussianMobileFilter` — российские; язык текстов
821
945
  задаётся, см. «Языки».
822
946
 
947
+ ## Обновление с 0.15
948
+
949
+ | Было | Стало |
950
+ | --- | --- |
951
+ | `SmallBadge` | `InfoPill`, пропы те же; цвета `blue` нет |
952
+ | `<download-link :url="exportUrl" title="скачать xlsx" />` | `<action-pill icon="download" title="скачать xlsx" loading-text="формируется отчёт" :is-loading="exportLoading" @click="exportOrders" />` и `downloadFile(exportUrl)` в методе страницы |
953
+ | своя пилюля-кнопка с `loading` и событием `clicked` | `ActionPill`: `isLoading`, событие `click` |
954
+ | `rowColor` у `DataTable` — заливка строки | `rowStripe` — полоска слева; строки полосатые всегда |
955
+ | `color` пункта меню — `yellow` или `red`; `Dot` — `red` или `green` | любое имя из списка цветов |
956
+ | красная кнопка и красный пункт — `red-50`/`red-700` | `red-100`/`red-800`, как все цвета списка |
957
+ | предупреждения о поле `danger` и слотах `actions`, `button` | их нет: пункт с `danger` — обычный пункт, слоты не рисуются |
958
+ | свой `TextPopover` проекта | `TextPopover` пакета; пустой текст — компонента нет |
959
+
960
+ Цвета `InfoPill` и `ActionPill` теперь подчиняются одной схеме. По
961
+ сравнению с `SmallBadge` зелёный ярче, с зелёным текстом; серый — с более
962
+ светлым фоном и более тёмным текстом; индиго — с индиго-текстом.
963
+
964
+ Метод страницы для «скачать xlsx»:
965
+
966
+ ```js
967
+ exportOrders() {
968
+ this.exportFailure = "";
969
+ this.exportLoading = true;
970
+ downloadFile(this.exportUrl)
971
+ .catch(() => { this.exportFailure = "Попробуйте ещё раз"; })
972
+ .finally(() => { this.exportLoading = false; });
973
+ }
974
+ ```
975
+
976
+ `0.16.0` не подтянется по `^0.15.x`: для версий `0.x` знак `^` пропускает
977
+ только патчи. Обновление — `npm install @boobooking/dashboard-ui-components@^0.16.0`.
978
+
823
979
  ## Обновление с 0.14
824
980
 
825
981
  - Меню профиля в шапке переходит с `Popup` на `HamburgerMenu`: кнопку ☰,
@@ -883,6 +1039,8 @@ Tailwind, `@tailwindcss/forms` и типографикой, как у потре
883
1039
  - `DropdownButtonWithAction` строится из списка действий: первое действие —
884
1040
  основная кнопка, остальные — меню. Слота `button` нет: переданный слот
885
1041
  не рисуется, а в режиме разработки в консоль уходит предупреждение.
1042
+ Предупреждение было только в 0.15, с 0.16.0 его нет: оставшийся слот
1043
+ молча игнорируется.
886
1044
  Отступы и шрифт основной кнопки задаёт компонент (`px-4 py-2 text-sm
887
1045
  font-medium`). Было:
888
1046
 
@@ -954,7 +1112,8 @@ Tailwind, `@tailwindcss/forms` и типографикой, как у потре
954
1112
  `retryFromDropdown` удаляется: он полагался на разметку пакета.
955
1113
  - Поле `danger` заменено цветом: `danger: true` → `color: 'red'`. Пункт
956
1114
  с `danger` рисуется обычным, а в режиме разработки в консоль уходит
957
- предупреждение с заменой. Новый цвет — `color: 'yellow'`. Цвета есть
1115
+ предупреждение с заменой. Предупреждение было только в 0.15, с 0.16.0
1116
+ его нет: оставшееся поле молча игнорируется. Новый цвет — `color: 'yellow'`. Цвета есть
958
1117
  и у пунктов `HamburgerMenu`.
959
1118
  - Красный пункт меню — мягкий: красный текст, при подсветке светлый
960
1119
  красный фон, а не заливка `red-400` с белым текстом.
@@ -992,7 +1151,9 @@ Tailwind, `@tailwindcss/forms` и типографикой, как у потре
992
1151
  ]"
993
1152
 
994
1153
  Меню со старым слотом остаётся без пунктов и без стрелки; в режиме
995
- разработки компонент пишет об этом в консоль.
1154
+ разработки компонент пишет об этом в консоль. Это предупреждение было
1155
+ в 0.14–0.15, с 0.16.0 его нет: оставшийся слот молча игнорируется, а
1156
+ `DropdownButtonWithAction` без `actions` ничего не рисует.
996
1157
  - `0.14.0` не подтянется по `^0.13.0`: для версий `0.x` знак `^` пропускает
997
1158
  только патчи. Обновление — `npm install @boobooking/dashboard-ui-components@^0.14.0`.
998
1159
 
@@ -1026,9 +1187,10 @@ Tailwind, `@tailwindcss/forms` и типографикой, как у потре
1026
1187
  приложения нет: вид компонентов не зависит ни от того, какие утилиты
1027
1188
  генерирует приложение, ни от его палитры. Общими остаются только служебные
1028
1189
  переменные Tailwind `--tw-*` с их `@property` — на одной версии Tailwind у
1029
- пакета и приложения они объявлены одинаково — и глобальный `@keyframes pulse`
1030
- (его использует `bb:animate-pulse` у `Dot`): если приложение объявит свой
1031
- `pulse`, победит тот, что подключён позже.
1190
+ пакета и приложения они объявлены одинаково — и глобальные `@keyframes pulse` и
1191
+ `spin` (их используют `bb:animate-pulse` у `Dot` и стрелки часов
1192
+ `ActionPill`): если приложение объявит свой `pulse` или `spin`, победит тот,
1193
+ что подключён позже.
1032
1194
 
1033
1195
  Порядок «стили пакета до стилей приложения» по-прежнему нужен: классы,
1034
1196
  которые приложение передаёт на корень компонента, — его собственные