@boobooking/dashboard-ui-components 0.15.0 → 0.16.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
@@ -65,31 +65,49 @@ 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, а не в исходном коде.
83
101
 
84
102
  ### Dot
85
103
 
86
- Индикатор-точка: красная или зелёная, с пульсацией или без.
104
+ Индикатор-точка любого цвета из списка, с пульсацией или без.
87
105
 
88
106
  <dot color="green" :with-pulse="isLive" />
89
107
 
90
108
  | Проп | Тип | По умолчанию | Описание |
91
109
  | --- | --- | --- | --- |
92
- | `color` | `String` | обязателен | `"red"` или `"green"` |
110
+ | `color` | `String` | обязателен | Имя из списка цветов (раздел «Цвета») |
93
111
  | `withPulse` | `Boolean` | `false` | Добавляет анимацию пульсации |
94
112
 
95
113
  Событий нет. Значения у `Dot` тоже нет — см. раздел
@@ -224,16 +242,17 @@ Chrome 114+, Firefox 125+. В браузерах старше меню, спис
224
242
  внутри списка — нет. Открытие другого списка, календаря или меню
225
243
  закрывает предыдущее.
226
244
 
227
- ### SmallBadge
245
+ ### InfoPill
228
246
 
229
- Бейдж-пилюля с коротким текстом. Текст не переносится.
247
+ Пилюля, которая только показывает текст: статус, счётчик, флаг, пометку.
248
+ Текст не переносится.
230
249
 
231
- <small-badge text="Отправлено" color="green" />
250
+ <info-pill text="доставлено" color="green" />
232
251
 
233
252
  | Проп | Тип | По умолчанию | Описание |
234
253
  | --- | --- | --- | --- |
235
- | `text` | `String` | обязателен | Текст бейджа |
236
- | `color` | `String` | обязателен | `"green"`, `"indigo"`, `"gray"`, `"blue"`, `"red"` или `"yellow"` |
254
+ | `text` | `String` | обязателен | Текст пилюли |
255
+ | `color` | `String` | обязателен | Имя из списка цветов |
237
256
 
238
257
  Событий нет.
239
258
 
@@ -251,19 +270,60 @@ Chrome 114+, Firefox 125+. В браузерах старше меню, спис
251
270
 
252
271
  Событий нет.
253
272
 
254
- ### DownloadLink
273
+ ### ActionPill
255
274
 
256
- Ссылка на файл в виде бейджа с иконкой скачивания. Кликабелен весь бейдж.
275
+ Пилюля, которой запускают действие: скачать отчёт, запросить статусы. Что
276
+ делает действие, пилюля не знает — страница слушает `click` и сама передаёт
277
+ `isLoading`, пока действие идёт.
257
278
 
258
- <download-link :url="exportUrl" title="скачать xlsx" />
279
+ <action-pill
280
+ icon="download"
281
+ title="скачать xlsx"
282
+ loading-text="формируется отчёт"
283
+ :is-loading="exportLoading"
284
+ @click="exportOrders"
285
+ />
259
286
 
260
287
  | Проп | Тип | По умолчанию | Описание |
261
288
  | --- | --- | --- | --- |
262
- | `url` | `String` | обязателен | Адрес файла |
263
- | `title` | `String` | `null` | Подпись и всплывающая подсказка; без него — «Скачать» / «Download» по языку |
264
- | `lang` | `String` | язык плагина | `"ru"` или `"en"` |
289
+ | `title` | `String` | обязателен | Подпись и всплывающая подсказка |
290
+ | `icon` | `String` | обязателен | `"download"` или `"refresh"` |
291
+ | `color` | `String` | `"purple"` | Имя из списка цветов |
292
+ | `isLoading` | `Boolean` | `false` | Идёт работа |
293
+ | `loadingText` | `String` | `null` | Подпись на время работы; без неё остаётся `title` |
265
294
 
266
- Событий нет.
295
+ Событие: `click` без аргументов.
296
+
297
+ Пока идёт работа, пилюля погашена и недоступна — второй клик не проходит,
298
+ вместо иконки бегут стрелки часов, подпись — `loadingText`. При системной
299
+ настройке «уменьшить движение» стрелки стоят. Иконки пакета — `download`
300
+ и `refresh`; новое действие с новой иконкой — новая иконка в пакете.
301
+
302
+ ### downloadFile
303
+
304
+ Функция: скачивает файл запросом и отдаёт его браузеру. Страница знает,
305
+ когда файл пришёл, — так показывается работа на `ActionPill`.
306
+
307
+ ```js
308
+ import { downloadFile } from '@boobooking/dashboard-ui-components'
309
+
310
+ exportOrders() {
311
+ this.exportLoading = true;
312
+ downloadFile(this.exportUrl)
313
+ .catch(() => { this.exportFailure = "Попробуйте ещё раз"; })
314
+ .finally(() => { this.exportLoading = false; });
315
+ }
316
+ ```
317
+
318
+ - Запрос — `GET` с cookie сессии (`credentials: 'same-origin'`).
319
+ - Promise отклоняется: при ответе не `2xx` (код в тексте ошибки), при
320
+ перенаправлении — обычно на страницу входа после истёкшей сессии — и при
321
+ сетевой ошибке.
322
+ - Имя файла — из `Content-Disposition` (`filename*=UTF-8''…`, затем
323
+ `filename`), без него — последний сегмент пути адреса, без пути —
324
+ `download`.
325
+ - Таймаута нет; уход со страницы скачивание не прерывает. Файл до
326
+ сохранения целиком в памяти вкладки.
267
327
 
268
328
  ### ConfirmationModal
269
329
 
@@ -331,7 +391,7 @@ ConfirmationModal нет v-model».
331
391
  | `label` | `String`, обязательно | Текст кнопки или пункта меню |
332
392
  | `href` | `String` | Переход: обычный клик уходит в `navigate` плагина `dashboardUi`, клик с Cmd/Ctrl/Shift и средней кнопкой — браузеру; без `navigate` — обычная ссылка |
333
393
  | `onSelect` | `Function` | Действие: вызывается без аргументов |
334
- | `color` | `"yellow"` или `"red"` | Цвет; без поля — обычный |
394
+ | `color` | `String` | Имя из списка цветов; без поля — обычный |
335
395
 
336
396
  Основная кнопка работает как пункт меню: переход — ссылка, действие —
337
397
  кнопка, и `onSelect` вызывает сам компонент — по клику, Enter и пробелу.
@@ -339,10 +399,9 @@ ConfirmationModal нет v-model».
339
399
  разбираться в разметке компонента.
340
400
 
341
401
  Цвет первого действия красит основную кнопку вместе со стрелкой, цвет
342
- пункта меню — только этот пункт. Обычная кнопка — белая с серой рамкой,
343
- жёлтая и красная — светлый фон, рамка и текст своего цвета. Обычный пункт
344
- меню — серый текст, при подсветке серый фон; жёлтый и красный — текст
345
- своего цвета, при подсветке светлый фон того же цвета.
402
+ пункта меню — только этот пункт. Без цвета кнопка белая с серой рамкой,
403
+ пункт — серый текст и серый фон при подсветке; с цветом — по разделу
404
+ «Цвета».
346
405
 
347
406
  Неверный список Vue отмечает предупреждением о пропе в режиме разработки,
348
407
  а компонент не падает: элементы-необъекты пропускает, кнопка без функции
@@ -404,7 +463,7 @@ ConfirmationModal нет v-model».
404
463
 
405
464
  Пункты, их проверка и вид — как у `DropdownButtonWithAction`: переход —
406
465
  `{ label, href }`, действие — `{ label, onSelect }`, цвет —
407
- `color: 'yellow'` или `color: 'red'`. Выход запросом DELETE — действие:
466
+ `color: имя из списка цветов`. Выход запросом DELETE — действие:
408
467
  Inertia пакет не импортирует, `router.delete` вызывает страница.
409
468
 
410
469
  Событий и `v-model` нет: меню открывают и закрывают кнопка, клик вне меню,
@@ -441,10 +500,10 @@ Escape, клик по пункту, прокрутка и изменение р
441
500
  empty-text="Не найдено ордеров"
442
501
  >
443
502
  <template #results-actions>
444
- <download-link :url="exportUrl" title="скачать xlsx" />
503
+ <action-pill icon="download" title="скачать xlsx" :is-loading="exportLoading" @click="exportOrders" />
445
504
  </template>
446
505
  <template #cell-status="{ row }">
447
- <small-badge :text="row.statusLabel" :color="row.statusColor" />
506
+ <info-pill :text="row.statusLabel" :color="row.statusColor" />
448
507
  </template>
449
508
  </data-table>
450
509
 
@@ -467,7 +526,7 @@ Escape, клик по пункту, прокрутка и изменение р
467
526
  | `foundText` | `String` | `null` | «Найдено ордеров» → бейдж «Найдено ордеров: 100», когда записи есть |
468
527
  | `emptyText` | `String` | `null` | «Не найдено ордеров» — бейдж, когда записей нет |
469
528
  | `variant` | `String` | `"page"` | `"page"` — отдельная карточка с тенью; `"card"` — таблица внутри карточки страницы, только линия сверху |
470
- | `rowColor` | `Function` | `null` | `row => 'red' \| 'green' \| null` — цвет строки вместо полосатости |
529
+ | `rowStripe` | `Function` | `null` | `row => имя цвета \| null` — полоска слева в первой ячейке строки; строки полосатые всегда |
471
530
  | `lang` | `String` | язык плагина | `"ru"` или `"en"` — тексты пагинации |
472
531
 
473
532
  Столбец:
@@ -692,17 +751,39 @@ sm:rounded-lg`, `box-sizing: border-box`. Отступов у неё нет: ф
692
751
  уведомление. `class` и атрибуты попадают на корень на весь экран, так что
693
752
  страница может поднять его своим классом, например `class="z-30"`.
694
753
 
754
+ ### TextPopover
755
+
756
+ Иконка-глаз, по клику — подсказка со скрытым текстом: длинный текст SMS,
757
+ значение ключа. Пустой текст — компонента нет.
758
+
759
+ <text-popover :text="row.message" />
760
+
761
+ | Проп | Тип | По умолчанию | Описание |
762
+ | --- | --- | --- | --- |
763
+ | `text` | `String` | обязателен | Скрытый текст; `null` и `""` — компонента нет |
764
+ | `modelValue` | `Boolean` | `false` | Открыта ли подсказка; `v-model` необязателен |
765
+ | `lang` | `String` | язык плагина | `"ru"` или `"en"` |
766
+
767
+ Событие: `update:modelValue` — когда подсказка открылась или закрылась сама:
768
+ кнопкой, кликом вне, Escape, прокруткой, изменением размера окна, опустевшим
769
+ текстом. Значение, пришедшее от родителя, эхом не возвращается.
770
+
771
+ Подсказка открывается в верхнем слое браузера (Popover API): правым краем по
772
+ правому краю иконки, шириной до 384 px, вниз, если помещается, иначе туда,
773
+ где места больше; длинный текст прокручивается внутри, в том числе с
774
+ клавиатуры. Пока подсказка открыта, остальная страница не выделяется:
775
+ тройной клик и протяжка мышью выделяют только её текст. У левого края окна
776
+ подсказка сужается до места слева от иконки, как и меню.
777
+
695
778
  ## Языки
696
779
 
697
780
  Тексты пакета есть на русском и английском. Язык компонента — проп `lang`, если
698
781
  он задан, иначе язык плагина `dashboardUi`, иначе русский. Явно переданный текст
699
- главнее языка: `cancel-button-text` у `ConfirmationModal`, `title` у
700
- `DownloadLink`.
782
+ главнее языка: `cancel-button-text` у `ConfirmationModal`.
701
783
 
702
784
  | Компонент | `ru` | `en` |
703
785
  | --- | --- | --- |
704
786
  | `ConfirmationModal` — кнопка отмены | Отмена | Cancel |
705
- | `DownloadLink` — подпись | Скачать | Download |
706
787
  | `DropdownButtonWithAction` — подпись стрелки для скринридера | Открыть меню | Open menu |
707
788
  | `HamburgerMenu` — подпись кнопки для скринридера | Открыть меню | Open menu |
708
789
  | `SelectDateInterval` — месяцы, дни недели, кнопки календарей | по-русски | in English |
@@ -710,6 +791,7 @@ sm:rounded-lg`, `box-sizing: border-box`. Отступов у неё нет: ф
710
791
  | `DataTable` — пагинация | Предыдущая / Следующая / Показаны результаты X - Y из Z | Previous / Next / Showing X - Y of Z results |
711
792
  | `PageCard` — доступное имя крестика | Назад | Back |
712
793
  | `NotificationMessage` — подпись крестика для скринридера | Закрыть | Close |
794
+ | `TextPopover` — подпись кнопки и имя области | Показать текст / Полный текст | Show text / Full text |
713
795
 
714
796
  Формат даты — `дд.мм.гггг` в обоих языках: это формат значения, а не текст.
715
797
  Неделя начинается с понедельника. Календари `SelectDateInterval` берут язык
@@ -756,20 +838,20 @@ Inertia SSR), а серверная разметка гидратируется
756
838
  `class`, в `:class` и в пропсах `*-class` у `<transition>`; варианты идут
757
839
  после префикса: `bb:sm:inline-block`, `bb:hover:bg-red-700`. Утилита без
758
840
  префикса не сгенерируется. Классы в `:class` пишутся литералами — ключами
759
- объекта, ветками тернарного оператора, элементами массива. Оба правила
841
+ объекта, ветками тернарного оператора, элементами массива. Цветовые классы
842
+ компонент не пишет сам — берёт из `src/colors.js` вызовом
843
+ `colorClass(имя, набор)`, и эту форму тест тоже принимает. Оба правила
760
844
  проверяет `tests/utilityPrefix.test.js`.
761
845
  - Тексты интерфейса — только в `src/i18n.js`, в словарях `ru` и `en` с
762
846
  одинаковыми ключами; компонент берёт их через миксин `withLang`
763
847
  (`this.texts`) и получает проп `lang`.
764
848
  - Ссылка компонента — настоящий `<a href>`; обычный клик — через
765
849
  `followLink($event, href)` миксина `withNavigation`, который отдаёт его
766
- `navigate` плагина. Ни Inertia, ни роутер пакет не импортирует. Исключение —
767
- `DownloadLink`: это обычная ссылка браузера, скачивающая файл, и через
768
- `navigate` она не идёт. Через `navigate` ходят `DataTable` (его пагинация),
769
- `NavigationMenuElement`, основная кнопка-переход и пункты-переходы
770
- `DropdownButtonWithAction` и пункты-переходы `HamburgerMenu`. Крестик
771
- `PageCard` — кнопка, а не ссылка: адрес возврата он тоже отдаёт
772
- `navigate`.
850
+ `navigate` плагина. Ни Inertia, ни роутер пакет не импортирует. Через `navigate` ходят
851
+ `DataTable` (его пагинация), `NavigationMenuElement`, основная
852
+ кнопка-переход и пункты-переходы `DropdownButtonWithAction` и
853
+ пункты-переходы `HamburgerMenu`. Крестик `PageCard` — кнопка, а не ссылка:
854
+ адрес возврата он тоже отдаёт `navigate`.
773
855
  - Компонент обращается к `window`, `document` и другим API браузера только
774
856
  в `mounted()`, `beforeUnmount()` и обработчиках событий; загрузка модуля,
775
857
  `data()`, `computed` и рендер работают без браузера. Так пакет
@@ -804,7 +886,7 @@ Inertia SSR), а серверная разметка гидратируется
804
886
 
805
887
  npm run playground
806
888
 
807
- Поднимает демо-страницы со всеми пятнадцатью компонентами в двух окружениях:
889
+ Поднимает демо-страницы со всеми шестнадцатью компонентами в двух окружениях:
808
890
  голом (без Tailwind и стилей приложения) и в окружении приложения (с
809
891
  Tailwind, `@tailwindcss/forms` и типографикой, как у потребителя). Это
810
892
  основной способ посмотреть, как компоненты выглядят и ведут себя, а не
@@ -820,6 +902,38 @@ Tailwind, `@tailwindcss/forms` и типографикой, как у потре
820
902
  Правила номера телефона в `RussianMobileFilter` — российские; язык текстов
821
903
  задаётся, см. «Языки».
822
904
 
905
+ ## Обновление с 0.15
906
+
907
+ | Было | Стало |
908
+ | --- | --- |
909
+ | `SmallBadge` | `InfoPill`, пропы те же; цвета `blue` нет |
910
+ | `<download-link :url="exportUrl" title="скачать xlsx" />` | `<action-pill icon="download" title="скачать xlsx" loading-text="формируется отчёт" :is-loading="exportLoading" @click="exportOrders" />` и `downloadFile(exportUrl)` в методе страницы |
911
+ | своя пилюля-кнопка с `loading` и событием `clicked` | `ActionPill`: `isLoading`, событие `click` |
912
+ | `rowColor` у `DataTable` — заливка строки | `rowStripe` — полоска слева; строки полосатые всегда |
913
+ | `color` пункта меню — `yellow` или `red`; `Dot` — `red` или `green` | любое имя из списка цветов |
914
+ | красная кнопка и красный пункт — `red-50`/`red-700` | `red-100`/`red-800`, как все цвета списка |
915
+ | предупреждения о поле `danger` и слотах `actions`, `button` | их нет: пункт с `danger` — обычный пункт, слоты не рисуются |
916
+ | свой `TextPopover` проекта | `TextPopover` пакета; пустой текст — компонента нет |
917
+
918
+ Цвета `InfoPill` и `ActionPill` теперь подчиняются одной схеме. По
919
+ сравнению с `SmallBadge` зелёный ярче, с зелёным текстом; серый — с более
920
+ светлым фоном и более тёмным текстом; индиго — с индиго-текстом.
921
+
922
+ Метод страницы для «скачать xlsx»:
923
+
924
+ ```js
925
+ exportOrders() {
926
+ this.exportFailure = "";
927
+ this.exportLoading = true;
928
+ downloadFile(this.exportUrl)
929
+ .catch(() => { this.exportFailure = "Попробуйте ещё раз"; })
930
+ .finally(() => { this.exportLoading = false; });
931
+ }
932
+ ```
933
+
934
+ `0.16.0` не подтянется по `^0.15.x`: для версий `0.x` знак `^` пропускает
935
+ только патчи. Обновление — `npm install @boobooking/dashboard-ui-components@^0.16.0`.
936
+
823
937
  ## Обновление с 0.14
824
938
 
825
939
  - Меню профиля в шапке переходит с `Popup` на `HamburgerMenu`: кнопку ☰,
@@ -883,6 +997,8 @@ Tailwind, `@tailwindcss/forms` и типографикой, как у потре
883
997
  - `DropdownButtonWithAction` строится из списка действий: первое действие —
884
998
  основная кнопка, остальные — меню. Слота `button` нет: переданный слот
885
999
  не рисуется, а в режиме разработки в консоль уходит предупреждение.
1000
+ Предупреждение было только в 0.15, с 0.16.0 его нет: оставшийся слот
1001
+ молча игнорируется.
886
1002
  Отступы и шрифт основной кнопки задаёт компонент (`px-4 py-2 text-sm
887
1003
  font-medium`). Было:
888
1004
 
@@ -954,7 +1070,8 @@ Tailwind, `@tailwindcss/forms` и типографикой, как у потре
954
1070
  `retryFromDropdown` удаляется: он полагался на разметку пакета.
955
1071
  - Поле `danger` заменено цветом: `danger: true` → `color: 'red'`. Пункт
956
1072
  с `danger` рисуется обычным, а в режиме разработки в консоль уходит
957
- предупреждение с заменой. Новый цвет — `color: 'yellow'`. Цвета есть
1073
+ предупреждение с заменой. Предупреждение было только в 0.15, с 0.16.0
1074
+ его нет: оставшееся поле молча игнорируется. Новый цвет — `color: 'yellow'`. Цвета есть
958
1075
  и у пунктов `HamburgerMenu`.
959
1076
  - Красный пункт меню — мягкий: красный текст, при подсветке светлый
960
1077
  красный фон, а не заливка `red-400` с белым текстом.
@@ -992,7 +1109,9 @@ Tailwind, `@tailwindcss/forms` и типографикой, как у потре
992
1109
  ]"
993
1110
 
994
1111
  Меню со старым слотом остаётся без пунктов и без стрелки; в режиме
995
- разработки компонент пишет об этом в консоль.
1112
+ разработки компонент пишет об этом в консоль. Это предупреждение было
1113
+ в 0.14–0.15, с 0.16.0 его нет: оставшийся слот молча игнорируется, а
1114
+ `DropdownButtonWithAction` без `actions` ничего не рисует.
996
1115
  - `0.14.0` не подтянется по `^0.13.0`: для версий `0.x` знак `^` пропускает
997
1116
  только патчи. Обновление — `npm install @boobooking/dashboard-ui-components@^0.14.0`.
998
1117
 
@@ -1026,9 +1145,10 @@ Tailwind, `@tailwindcss/forms` и типографикой, как у потре
1026
1145
  приложения нет: вид компонентов не зависит ни от того, какие утилиты
1027
1146
  генерирует приложение, ни от его палитры. Общими остаются только служебные
1028
1147
  переменные Tailwind `--tw-*` с их `@property` — на одной версии Tailwind у
1029
- пакета и приложения они объявлены одинаково — и глобальный `@keyframes pulse`
1030
- (его использует `bb:animate-pulse` у `Dot`): если приложение объявит свой
1031
- `pulse`, победит тот, что подключён позже.
1148
+ пакета и приложения они объявлены одинаково — и глобальные `@keyframes pulse` и
1149
+ `spin` (их используют `bb:animate-pulse` у `Dot` и стрелки часов
1150
+ `ActionPill`): если приложение объявит свой `pulse` или `spin`, победит тот,
1151
+ что подключён позже.
1032
1152
 
1033
1153
  Порядок «стили пакета до стилей приложения» по-прежнему нужен: классы,
1034
1154
  которые приложение передаёт на корень компонента, — его собственные