@boobooking/dashboard-ui-components 0.12.0 → 0.14.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 +221 -42
- package/dist/index.js +737 -429
- package/dist/style.css +1 -1
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -15,16 +15,19 @@ import '@boobooking/dashboard-ui-components/style.css'
|
|
|
15
15
|
|
|
16
16
|
### Подключение к приложению
|
|
17
17
|
|
|
18
|
-
Плагин `dashboardUi` задаёт
|
|
19
|
-
|
|
18
|
+
Плагин `dashboardUi` задаёт язык, переход по ссылкам пакета и адрес
|
|
19
|
+
страницы на экране. Все параметры необязательны; без плагина компоненты
|
|
20
|
+
русскоязычные, ссылки — обычные `<a>`, а `PageCard` закрывается только на
|
|
21
|
+
`fallback-url`.
|
|
20
22
|
|
|
21
23
|
```js
|
|
22
24
|
import { dashboardUi } from '@boobooking/dashboard-ui-components'
|
|
23
|
-
import { router } from '@inertiajs/vue3'
|
|
25
|
+
import { router, usePage } from '@inertiajs/vue3'
|
|
24
26
|
|
|
25
27
|
createApp(App).use(dashboardUi, {
|
|
26
28
|
lang: 'en',
|
|
27
29
|
navigate: (href) => router.visit(href),
|
|
30
|
+
currentUrl: () => usePage().url,
|
|
28
31
|
})
|
|
29
32
|
```
|
|
30
33
|
|
|
@@ -35,6 +38,18 @@ createApp(App).use(dashboardUi, {
|
|
|
35
38
|
настоящий `<a href>` и отдают `navigate` только обычный клик левой кнопкой;
|
|
36
39
|
клики с Ctrl/Cmd/Shift/Alt, средней кнопкой и ссылки с `target` остаются
|
|
37
40
|
браузеру. Без `navigate` браузер идёт по ссылке сам.
|
|
41
|
+
- `currentUrl()` — адрес страницы на экране, по нему `PageCard` знает,
|
|
42
|
+
откуда его открыли. Для Inertia — `() => usePage().url` (проверено на
|
|
43
|
+
`@inertiajs/vue3` 3.6.1). Договор для другого роутера: функция читает
|
|
44
|
+
реактивное состояние роутера; её значение меняется при каждом показе
|
|
45
|
+
страницы с новым адресом, в том числе при замене записи истории,
|
|
46
|
+
«Назад»/«Вперёд» и первой загрузке, и меняется до создания компонентов
|
|
47
|
+
новой страницы; неуспешный или отменённый переход значения не меняет;
|
|
48
|
+
пока роутер не готов, функция возвращает `null` или `undefined`.
|
|
49
|
+
У Vue Router, например, до первой навигации `currentRoute` —
|
|
50
|
+
`START_LOCATION` с `fullPath === '/'`, и его надо отдавать как `null`.
|
|
51
|
+
Плагин следит за адресом только в браузере и перестаёт при
|
|
52
|
+
размонтировании приложения.
|
|
38
53
|
|
|
39
54
|
`navigate` получает адрес ровно таким, каким он лежит в компоненте:
|
|
40
55
|
пагинация `DataTable` отдаёт `links` Laravel как есть, а это абсолютные URL. С Vue
|
|
@@ -211,6 +226,18 @@ Chrome 114+, Firefox 125+. В браузерах старше меню видн
|
|
|
211
226
|
События: `update:modelValue` и `changed` — при выборе элемента (повторный
|
|
212
227
|
клик по уже выбранному снимает выбор) и при очистке через ластик.
|
|
213
228
|
|
|
229
|
+
С клавиатуры: пока список открыт, стрелки вверх и вниз переводят фокус по
|
|
230
|
+
пунктам и страницу не прокручивают. Отсчёт идёт от выбранного пункта: вниз —
|
|
231
|
+
следующий за ним, вверх — предыдущий; без выбранного вниз — первый пункт,
|
|
232
|
+
вверх — последний; с краёв — по кругу. Enter или пробел выбирают пункт под
|
|
233
|
+
фокусом так же, как клик, Escape закрывает список. После закрытия фокус
|
|
234
|
+
возвращается на кнопку фильтра. У закрытого списка стрелки прокручивают
|
|
235
|
+
страницу.
|
|
236
|
+
|
|
237
|
+
Подсветка пункта — это фокус, и мышь ведёт тот же фокус: движение по пункту
|
|
238
|
+
ставит фокус на него, стрелки продолжают от пункта под курсором. Подсвечен
|
|
239
|
+
всегда один пункт — тот, на который последними указали клавиатура или мышь.
|
|
240
|
+
|
|
214
241
|
### SmallBadge
|
|
215
242
|
|
|
216
243
|
Бейдж-пилюля с коротким текстом. Текст не переносится.
|
|
@@ -301,19 +328,45 @@ ConfirmationModal нет v-model».
|
|
|
301
328
|
### DropdownButtonWithAction
|
|
302
329
|
|
|
303
330
|
Кнопка с меню дополнительных действий: основная часть — слот `button`, стрелка
|
|
304
|
-
справа открывает меню из
|
|
331
|
+
справа открывает меню из пунктов пропа `actions`. Без пунктов стрелки нет, и
|
|
305
332
|
кнопка скругляется с обеих сторон.
|
|
306
333
|
|
|
307
|
-
<dropdown-button-with-action
|
|
334
|
+
<dropdown-button-with-action
|
|
335
|
+
v-model="menuIsOpen"
|
|
336
|
+
:actions="[
|
|
337
|
+
{ label: 'Поменять пароль', href: route('user.password.edit', { user: row.getId() }) },
|
|
338
|
+
{ label: 'Удалить', danger: true, onSelect: () => prepareUserDelete(row) },
|
|
339
|
+
]"
|
|
340
|
+
>
|
|
308
341
|
<template #button>…основное действие…</template>
|
|
309
|
-
<template #actions>…пункты меню…</template>
|
|
310
342
|
</dropdown-button-with-action>
|
|
311
343
|
|
|
312
344
|
| Проп | Тип | По умолчанию | Описание |
|
|
313
345
|
| --- | --- | --- | --- |
|
|
346
|
+
| `actions` | `Array` | `[]` | Пункты меню, см. ниже |
|
|
314
347
|
| `modelValue` | `Boolean` | `false` | Открыто ли меню |
|
|
315
348
|
| `lang` | `String` | язык плагина | `"ru"` или `"en"` |
|
|
316
349
|
|
|
350
|
+
Пункт меню — объект одной из двух форм: переход (`href` без `onSelect`) или
|
|
351
|
+
действие (`onSelect` без `href`). Поле со значением `undefined` считается
|
|
352
|
+
отсутствующим.
|
|
353
|
+
|
|
354
|
+
| Поле | Тип | Описание |
|
|
355
|
+
| --- | --- | --- |
|
|
356
|
+
| `label` | `String`, обязательно | Текст пункта |
|
|
357
|
+
| `href` | `String` | Переход: обычный клик уходит в `navigate` плагина `dashboardUi`, клик с Cmd/Ctrl/Shift и средней кнопкой — браузеру; без `navigate` — обычная ссылка |
|
|
358
|
+
| `onSelect` | `Function` | Действие: вызывается без аргументов при выборе пункта |
|
|
359
|
+
| `danger` | `Boolean` | Опасный пункт — красный; по умолчанию `false` |
|
|
360
|
+
|
|
361
|
+
Неверный список Vue отмечает предупреждением о пропе в режиме разработки,
|
|
362
|
+
а компонент не падает: элементы-необъекты пропускает, кнопка без функции
|
|
363
|
+
`onSelect` только закрывает меню. `null` — пустой список.
|
|
364
|
+
|
|
365
|
+
Вид пунктов задаёт компонент: страница передаёт данные, а не разметку,
|
|
366
|
+
и классов пунктам не даёт. Обычный пункт — серый текст, при подсветке —
|
|
367
|
+
серый фон; опасный — красный фон, при подсветке темнее. Слота `actions`
|
|
368
|
+
нет с версии 0.14.0 — см. «Обновление с 0.13».
|
|
369
|
+
|
|
317
370
|
Событие: `update:modelValue` — только когда меню открыл или закрыл сам
|
|
318
371
|
компонент или браузер: клик по стрелке, клик вне меню, Escape, клик
|
|
319
372
|
по пункту меню, прокрутка, изменение размера окна. Значение, пришедшее
|
|
@@ -327,6 +380,14 @@ ConfirmationModal нет v-model».
|
|
|
327
380
|
по любому пункту, прокруткой страницы или таблицы и изменением размера
|
|
328
381
|
окна. Открытие другого меню закрывает предыдущее.
|
|
329
382
|
|
|
383
|
+
Пока меню открыто, стрелки вверх и вниз переводят фокус по пунктам и
|
|
384
|
+
страницу не прокручивают: вниз — на первый пункт, вверх — на последний,
|
|
385
|
+
дальше — по соседним, с краёв — по кругу. Enter на пункте под фокусом
|
|
386
|
+
выбирает его. Подсветка пункта — это фокус, и мышь ведёт тот же фокус:
|
|
387
|
+
движение по пункту ставит фокус на него, стрелки продолжают от пункта под
|
|
388
|
+
курсором. Подсвечен всегда один пункт — тот, на который последними указали
|
|
389
|
+
клавиатура или мышь.
|
|
390
|
+
|
|
330
391
|
### DataTable
|
|
331
392
|
|
|
332
393
|
Список данных: бейдж «Найдено X: N», таблица в карточке с горизонтальной
|
|
@@ -421,64 +482,137 @@ ConfirmationModal нет v-model».
|
|
|
421
482
|
|
|
422
483
|
### PageCard
|
|
423
484
|
|
|
424
|
-
Карточка отдельной страницы — формы или просмотра записи — по центру
|
|
425
|
-
|
|
485
|
+
Карточка отдельной страницы — формы или просмотра записи — по центру
|
|
486
|
+
с крестиком, который ведёт туда, откуда карточку открыли.
|
|
426
487
|
|
|
427
|
-
<page-card class="px-4 pt-4 sm:px-6 sm:pt-6">
|
|
488
|
+
<page-card class="px-4 pt-4 sm:px-6 sm:pt-6" :fallback-url="route('users')">
|
|
428
489
|
<h3 class="pr-(--bb-closer-space) text-lg font-medium">Создание администратора</h3>
|
|
429
490
|
…поля формы…
|
|
430
491
|
</page-card>
|
|
431
492
|
|
|
432
493
|
Страница просмотра, у секций которой свои отступы:
|
|
433
494
|
|
|
434
|
-
<page-card>
|
|
495
|
+
<page-card :fallback-url="route('payments')">
|
|
435
496
|
<div class="px-4 py-5 border-b border-gray-200 sm:px-6">
|
|
436
497
|
<h3 class="pr-(--bb-closer-space) text-lg font-medium">{{ name }}</h3>
|
|
437
498
|
</div>
|
|
438
499
|
<div class="overflow-hidden sm:rounded-b-lg">…строки…</div>
|
|
439
500
|
</page-card>
|
|
440
501
|
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
502
|
+
**Куда ведёт крестик.** Плагин `dashboardUi` с `currentUrl` (см.
|
|
503
|
+
«Подключение к приложению») помнит адрес страницы, которая была на экране
|
|
504
|
+
перед карточкой, со всеми её фильтрами и номером страницы, и крестик
|
|
505
|
+
ведёт ровно туда. Адрес не попадает ни в адрес страницы, ни в хранилища
|
|
506
|
+
браузера, ни в историю: он живёт в памяти приложения. «Как было» — это
|
|
507
|
+
адрес: прокрутку, несохранённый ввод и раскрытые элементы
|
|
508
|
+
страницы-источника карточка не возвращает.
|
|
509
|
+
|
|
510
|
+
Если адреса нет — карточку открыли в новой вкладке, прямой ссылкой, после
|
|
511
|
+
F5 или в приложении без `currentUrl`, — крестик ведёт на `fallback-url`.
|
|
512
|
+
Без `fallback-url` крестика нет. Истории браузера карточка не касается.
|
|
513
|
+
|
|
514
|
+
**Окна.** Открытая карточка — окно. Карточка, открытая со страницы
|
|
515
|
+
другой карточки (например, форма с таба), — вложенное окно: её крестик
|
|
516
|
+
ведёт на страницу, с которой её открыли, а крестик внешней карточки —
|
|
517
|
+
по-прежнему туда, откуда открыли её. Окно закрывается, когда показана
|
|
518
|
+
страница, куда оно возвращает: крестиком, «Отменой», после успешного
|
|
519
|
+
действия или кнопкой «Назад» браузера.
|
|
520
|
+
|
|
521
|
+
**Карточка из нескольких страниц** (табы) — постоянный макет этих страниц
|
|
522
|
+
Inertia с общим ключом окна:
|
|
523
|
+
|
|
524
|
+
export default {
|
|
525
|
+
layout: (props) => [PageCard, {
|
|
526
|
+
width: '7xl',
|
|
527
|
+
windowKey: `group:${props.group.data.uuid}`,
|
|
528
|
+
fallbackUrl: route('groups'),
|
|
529
|
+
class: 'px-4 py-4 sm:px-6 sm:py-6',
|
|
530
|
+
}],
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
`layout` — стрелочная функция одного аргумента или кортеж: обычную
|
|
534
|
+
функцию Inertia примет за компонент. Пока соседние страницы объявляют тот
|
|
535
|
+
же макет, карточка не пересоздаётся, и смена таба, фильтров и страницы
|
|
536
|
+
таблицы окна не меняет. Ключ окна по умолчанию — путь страницы без query:
|
|
537
|
+
отдельной странице-карточке его задавать не нужно, а если роутер
|
|
538
|
+
переиспользовал её для другой записи (`/users/1/edit` → `/users/2/edit`),
|
|
539
|
+
у неё новое окно. Ключ меняется только вместе со сменой страницы: смена
|
|
540
|
+
без неё оставляет карточку в прежнем окне и пишет предупреждение
|
|
541
|
+
в консоль. Рецепт проверен на `@inertiajs/vue3` 3.6.1.
|
|
542
|
+
|
|
543
|
+
**«Отмена» и закрытие из кода.** `close()` делает то же, что крестик.
|
|
544
|
+
Он доступен пропом слота по умолчанию и методом компонента:
|
|
545
|
+
|
|
546
|
+
<page-card ref="card" v-slot="{ close }" :fallback-url="route('users')">
|
|
547
|
+
…
|
|
548
|
+
<button type="button" @click="close">Отмена</button>
|
|
549
|
+
</page-card>
|
|
550
|
+
|
|
551
|
+
// после успешного сохранения
|
|
552
|
+
this.$refs.card.close()
|
|
553
|
+
|
|
554
|
+
`close()` переходит через `navigate` плагина, без него — полной загрузкой
|
|
555
|
+
страницы. Без адреса возврата и `fallback-url` он ничего не делает.
|
|
556
|
+
|
|
557
|
+
**Ширина и крестик.** От `width` зависят ширина карточки и порог, от
|
|
558
|
+
которого крестик стоит снаружи, на `1rem` правее её края; ниже порога —
|
|
559
|
+
в правом верхнем углу:
|
|
560
|
+
|
|
561
|
+
| `width` | Ширина от `sm` | Крестик снаружи |
|
|
562
|
+
| --- | --- | --- |
|
|
563
|
+
| `xl` (по умолчанию) | `max-w-xl` (36rem) | от `md` |
|
|
564
|
+
| `4xl` | `max-w-4xl` (56rem) | от `lg` |
|
|
565
|
+
| `7xl` | `max-w-7xl` (80rem) | от `2xl` |
|
|
566
|
+
|
|
567
|
+
Пороги рассчитаны на карточку по центру области на всю ширину страницы:
|
|
568
|
+
в узкой колонке или рядом с боковой панелью места снаружи может не
|
|
569
|
+
хватить.
|
|
461
570
|
|
|
462
571
|
Заголовок оставляет место под крестик правым отступом из переменной
|
|
463
|
-
`--bb-closer-space`: `3.5rem`, пока крестик в углу, `0` — когда он снаружи
|
|
464
|
-
его нет. В Tailwind это `pr-(--bb-closer-space)`; без Tailwind 4 —
|
|
465
|
-
`padding-right: var(--bb-closer-space)`, а в Tailwind 3 —
|
|
572
|
+
`--bb-closer-space`: `3.5rem`, пока крестик в углу, `0` — когда он снаружи
|
|
573
|
+
или его нет. В Tailwind это `pr-(--bb-closer-space)`; без Tailwind 4 —
|
|
574
|
+
обычный CSS `padding-right: var(--bb-closer-space)`, а в Tailwind 3 —
|
|
466
575
|
`pr-[var(--bb-closer-space)]`. Вне `PageCard` отступ равен нулю.
|
|
467
576
|
|
|
468
|
-
Карточка
|
|
469
|
-
|
|
470
|
-
|
|
577
|
+
**Атрибуты.** Карточка — `relative my-6 mx-auto bg-white shadow-xl
|
|
578
|
+
sm:rounded-lg`, `box-sizing: border-box`. Отступов у неё нет: форма
|
|
579
|
+
передаёт их классом на корень, страница просмотра — не передаёт. На корень
|
|
580
|
+
попадают `class`, `style`, `data-*` и `aria-*` приложения; классы
|
|
581
|
+
приложения сильнее классов пакета. Остальные атрибуты, в том числе `id`,
|
|
582
|
+
не переносятся: в роли макета карточка получает атрибутами пропы
|
|
583
|
+
страницы. Пропы страницы с именами пропов карточки — `lang`, `width`,
|
|
584
|
+
`fallbackUrl`, `windowKey` — приходят ей пропами, а не атрибутами; кортеж
|
|
585
|
+
макета перекрывает только те, что задаёт сам. Ресет пакета на карточку и её содержимое не распространяется:
|
|
586
|
+
разметка страницы, в том числе поля `@tailwindcss/forms`, выглядит так же,
|
|
587
|
+
как вне карточки.
|
|
588
|
+
|
|
589
|
+
Карточка не обрезает содержимое, как у `ConfirmationModal`: выпадающие
|
|
590
|
+
списки и календари могут выходить за её край. Блок со своим фоном у края
|
|
591
|
+
карточки скругляет свои углы сам — например, нижний блок строк:
|
|
471
592
|
`overflow-hidden sm:rounded-b-lg`.
|
|
472
593
|
|
|
473
|
-
Крестик доступен с клавиатуры: Tab, Enter, пробел; в порядке табуляции
|
|
474
|
-
идёт после содержимого карточки; при фокусе с клавиатуры
|
|
475
|
-
|
|
594
|
+
Крестик доступен с клавиатуры: Tab, Enter, пробел; в порядке табуляции
|
|
595
|
+
крестик идёт после содержимого карточки; при фокусе с клавиатуры вокруг
|
|
596
|
+
него кольцо. Доступное имя — «Назад» / «Back».
|
|
476
597
|
|
|
477
598
|
| Проп | Тип | По умолчанию | Описание |
|
|
478
599
|
| --- | --- | --- | --- |
|
|
600
|
+
| `width` | `String` | `"xl"` | `"xl"`, `"4xl"` или `"7xl"` |
|
|
601
|
+
| `fallback-url` | `String` | `null` | куда закрываться без адреса возврата; `""` — как `null` |
|
|
602
|
+
| `window-key` | `String` | путь страницы | общий ключ окна карточки из нескольких страниц |
|
|
479
603
|
| `lang` | `String` | язык плагина | `"ru"` или `"en"` |
|
|
480
604
|
|
|
481
|
-
Событий нет.
|
|
605
|
+
Событий нет. Проп слота по умолчанию — `close`.
|
|
606
|
+
|
|
607
|
+
Ограничения:
|
|
608
|
+
|
|
609
|
+
- память плагина не переживает F5 и новую вкладку: тогда работает
|
|
610
|
+
`fallback-url`;
|
|
611
|
+
- адреса сравниваются строкой: равнозначный адрес с другим порядком
|
|
612
|
+
параметров или с лишним `page=1` — другой адрес;
|
|
613
|
+
- если вернуться в карточку «Назад» или «Вперёд» после ухода из неё не
|
|
614
|
+
через крестик, адрес возврата — страница, с которой пришли в этот раз;
|
|
615
|
+
- на одной странице — одна карточка.
|
|
482
616
|
|
|
483
617
|
### NotificationMessage
|
|
484
618
|
|
|
@@ -549,8 +683,9 @@ sm:rounded-lg`, `box-sizing: border-box`. Отступов у неё нет: ф
|
|
|
549
683
|
Inertia SSR), а серверная разметка гидратируется без расхождений. К API
|
|
550
684
|
браузера компоненты обращаются только после монтирования, поэтому:
|
|
551
685
|
|
|
552
|
-
- `PageCard` на сервере рисует
|
|
553
|
-
|
|
686
|
+
- `PageCard` на сервере рисует крестик, только если задан `fallback-url`:
|
|
687
|
+
адрес возврата известен только в браузере, и крестик, ведущий на него,
|
|
688
|
+
появляется после монтирования;
|
|
554
689
|
- `PickDay` загружает Pikaday в браузере при монтировании: календарь
|
|
555
690
|
появляется, когда загрузка закончится;
|
|
556
691
|
- остальные компоненты рендерятся на сервере так же, как в браузере.
|
|
@@ -650,6 +785,50 @@ Tailwind, `@tailwindcss/forms` и типографикой, как у потре
|
|
|
650
785
|
Правила номера телефона в `RussianMobileFilter` — российские; язык текстов
|
|
651
786
|
задаётся, см. «Языки».
|
|
652
787
|
|
|
788
|
+
## Обновление с 0.13
|
|
789
|
+
|
|
790
|
+
- `DropdownButtonWithAction`: пункты меню передаются пропом `actions`,
|
|
791
|
+
слот `actions` убран, и страница больше не оформляет пункты — вид задаёт
|
|
792
|
+
компонент. Было:
|
|
793
|
+
|
|
794
|
+
<template v-slot:actions>
|
|
795
|
+
<Link
|
|
796
|
+
class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 hover:text-gray-900"
|
|
797
|
+
:href="route('user.password.edit', {'user': row.getId()})"
|
|
798
|
+
>
|
|
799
|
+
Поменять пароль
|
|
800
|
+
</Link>
|
|
801
|
+
<a
|
|
802
|
+
href="#"
|
|
803
|
+
@click.prevent="prepareUserDelete(row)"
|
|
804
|
+
class="block px-4 py-2 text-sm bg-red-400 hover:bg-red-500 text-white"
|
|
805
|
+
role="menuitem"
|
|
806
|
+
>
|
|
807
|
+
Удалить
|
|
808
|
+
</a>
|
|
809
|
+
</template>
|
|
810
|
+
|
|
811
|
+
Стало — проп на самом `dropdown-button-with-action`:
|
|
812
|
+
|
|
813
|
+
:actions="[
|
|
814
|
+
{ label: 'Поменять пароль', href: route('user.password.edit', { user: row.getId() }) },
|
|
815
|
+
{ label: 'Удалить', danger: true, onSelect: () => prepareUserDelete(row) },
|
|
816
|
+
]"
|
|
817
|
+
|
|
818
|
+
Меню со старым слотом остаётся без пунктов и без стрелки; в режиме
|
|
819
|
+
разработки компонент пишет об этом в консоль.
|
|
820
|
+
- `0.14.0` не подтянется по `^0.13.0`: для версий `0.x` знак `^` пропускает
|
|
821
|
+
только патчи. Обновление — `npm install @boobooking/dashboard-ui-components@^0.14.0`.
|
|
822
|
+
|
|
823
|
+
## Обновление с 0.12
|
|
824
|
+
|
|
825
|
+
- Крестик `PageCard` больше не ходит по истории: подключите `currentUrl`
|
|
826
|
+
к плагину и дайте карточкам `fallback-url`. Без них крестика нет.
|
|
827
|
+
- На корень `PageCard` переносятся только `class`, `style`, `data-*`
|
|
828
|
+
и `aria-*`.
|
|
829
|
+
- Карточка из нескольких страниц объявляет `PageCard` постоянным макетом
|
|
830
|
+
с `window-key` (см. раздел `PageCard`).
|
|
831
|
+
|
|
653
832
|
## Обновление с 0.11
|
|
654
833
|
|
|
655
834
|
- `Pagination` больше не экспортируется. Страница, импортирующая её
|