@boobooking/dashboard-ui-components 0.18.0 → 0.19.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 +125 -24
- package/dist/index.js +757 -468
- package/dist/style.css +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -65,10 +65,10 @@ Vue не ниже 3.5, ESM, сборщик, умеющий импорт CSS из
|
|
|
65
65
|
Tailwind, `@tailwindcss/forms`, Inertia и какие-либо токены в CSS приложения
|
|
66
66
|
пакету не нужны.
|
|
67
67
|
|
|
68
|
-
Меню `DropdownButtonWithAction` и `HamburgerMenu`,
|
|
68
|
+
Меню `DropdownButtonWithAction` и `HamburgerMenu`, списки `SelectSingle` и `SelectMultiple`,
|
|
69
69
|
календари `SelectDateInterval` и подсказка `TextPopover` стоят на Popover API
|
|
70
70
|
браузера: Safari 17+, Chrome 114+, Firefox 125+. В браузерах старше меню,
|
|
71
|
-
|
|
71
|
+
списки, календари и подсказка видны в потоке всегда.
|
|
72
72
|
|
|
73
73
|
## Цвета
|
|
74
74
|
|
|
@@ -90,8 +90,8 @@ Tailwind, `@tailwindcss/forms`, Inertia и какие-либо токены в C
|
|
|
90
90
|
|
|
91
91
|
## Компоненты
|
|
92
92
|
|
|
93
|
-
Пакет экспортирует
|
|
94
|
-
`Search`, `SelectDateInterval`, `SelectSingle`, `InfoPill`,
|
|
93
|
+
Пакет экспортирует девятнадцать компонентов: `Dot`, `RussianMobileFilter`,
|
|
94
|
+
`Search`, `SelectDateInterval`, `SelectSingle`, `SelectMultiple`, `InfoPill`,
|
|
95
95
|
`ErrorMessages`, `FormInput`, `ActionPill`, `ConfirmationModal`,
|
|
96
96
|
`DropdownButtonWithAction`, `HamburgerMenu`, `DataTable`,
|
|
97
97
|
`NavigationMenuElement`, `PageTabs`, `PageCard`, `NotificationMessage`,
|
|
@@ -99,13 +99,15 @@ Tailwind, `@tailwindcss/forms`, Inertia и какие-либо токены в C
|
|
|
99
99
|
(`files: ["dist"]`) исходники не попадают, поэтому контракт каждого
|
|
100
100
|
компонента — здесь и в playground, а не в исходном коде.
|
|
101
101
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
102
|
+
Ластики очистки фильтров идут в порядке Tab сразу после своего поля или
|
|
103
|
+
кнопки, в фокусе с клавиатуры вокруг крестика кольцо; нажимаются Enter и
|
|
104
|
+
пробелом. Крестики — закрытие `PageCard` и ластики очистки фильтров —
|
|
105
|
+
при нажатии коротко «вдавливаются», и действие выполняется после этого,
|
|
106
|
+
через 150 мс: иначе нажатия не было бы видно — ластик пропадает сразу
|
|
107
|
+
после очистки, крестик уводит со страницы. Так при любом нажатии: мышью,
|
|
108
|
+
касанием, Enter, пробелом, расширением клавиатурной навигации. Нажатия
|
|
109
|
+
во время анимации не считаются: одно нажатие — одно действие. При
|
|
110
|
+
«уменьшении движения» в системе — без анимации и сразу.
|
|
109
111
|
|
|
110
112
|
### Dot
|
|
111
113
|
|
|
@@ -263,13 +265,14 @@ Enter, пробелом, расширением клавиатурной нав
|
|
|
263
265
|
под курсором, поэтому календарь «до» открывается тем же кликом, что
|
|
264
266
|
закрывает «от».
|
|
265
267
|
|
|
266
|
-
С клавиатуры:
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
268
|
+
С клавиатуры: в поле даты стрелка вниз, Enter и пробел открывают календарь.
|
|
269
|
+
Кнопки календаря и списков в фокусе с клавиатуры обведены кольцом пакета. Пока
|
|
270
|
+
календарь открыт, стрелки переводят фокус по дням: влево и вправо — на день,
|
|
271
|
+
вверх и вниз — на неделю; с края месяца календарь листается, дата при этом не
|
|
272
|
+
выбирается. Первая стрелка ставит фокус на выбранный день, без выбранного — на
|
|
273
|
+
сегодня. Enter или пробел выбирают день под фокусом и стрелки месяцев — так
|
|
274
|
+
же, как клик; Escape закрывает календарь. После закрытия фокус возвращается на
|
|
275
|
+
поле. В поле можно перейти Tab и набрать дату.
|
|
273
276
|
|
|
274
277
|
### SelectSingle
|
|
275
278
|
|
|
@@ -281,7 +284,8 @@ Enter или пробел выбирают день под фокусом и с
|
|
|
281
284
|
/>
|
|
282
285
|
|
|
283
286
|
`items` — массив объектов `{ id, name }`. `v-model` держит `id` выбранного или
|
|
284
|
-
`null`, если не выбрано.
|
|
287
|
+
`null`, если не выбрано. Не массив, в том числе `null` и `undefined`, — пустой
|
|
288
|
+
список; элементы-необъекты в массиве пропускаются.
|
|
285
289
|
|
|
286
290
|
| Проп | Тип | По умолчанию | Описание |
|
|
287
291
|
| --- | --- | --- | --- |
|
|
@@ -298,7 +302,8 @@ Enter или пробел выбирают день под фокусом и с
|
|
|
298
302
|
пунктам и страницу не прокручивают. Отсчёт идёт от выбранного пункта: вниз —
|
|
299
303
|
следующий за ним, вверх — предыдущий; без выбранного вниз — первый пункт,
|
|
300
304
|
вверх — последний; с краёв — по кругу. Enter или пробел выбирают пункт под
|
|
301
|
-
фокусом так же, как клик, Escape закрывает список.
|
|
305
|
+
фокусом так же, как клик, Escape закрывает список. Tab и Shift+Tab ходят по
|
|
306
|
+
пунктам по кругу и наружу не выводят, пока список открыт. После закрытия фокус
|
|
302
307
|
возвращается на кнопку фильтра. У закрытого списка стрелки прокручивают
|
|
303
308
|
страницу.
|
|
304
309
|
|
|
@@ -317,6 +322,86 @@ Enter или пробел выбирают день под фокусом и с
|
|
|
317
322
|
внутри списка — нет. Открытие другого списка, календаря или меню
|
|
318
323
|
закрывает предыдущее.
|
|
319
324
|
|
|
325
|
+
### SelectMultiple
|
|
326
|
+
|
|
327
|
+
<select-multiple
|
|
328
|
+
header="Бренд"
|
|
329
|
+
:items="[{ id: 'rc', name: 'Royal Canin' }, { id: 'eukanuba', name: 'Eukanuba' }]"
|
|
330
|
+
v-model="brands"
|
|
331
|
+
@changed="reload"
|
|
332
|
+
/>
|
|
333
|
+
|
|
334
|
+
<select-multiple header="Мероприятие" :items="events" v-model="eventIds" with-search @changed="reload"/>
|
|
335
|
+
|
|
336
|
+
Тот же фильтр, что `SelectSingle`, но выбрать можно несколько пунктов.
|
|
337
|
+
`items` — массив объектов `{ id, name }`. `v-model` держит массив `id`
|
|
338
|
+
выбранных пунктов, пустой массив — ничего не выбрано. `id` — строка или число,
|
|
339
|
+
сравнение строгое.
|
|
340
|
+
|
|
341
|
+
| Проп | Тип | По умолчанию | Описание |
|
|
342
|
+
| --- | --- | --- | --- |
|
|
343
|
+
| `items` | `Array` | обязателен | Массив `{ id, name }` |
|
|
344
|
+
| `modelValue` | `Array` | `[]` | `id` выбранных пунктов |
|
|
345
|
+
| `header` | `String` | обязателен | Подпись поля |
|
|
346
|
+
| `isRequired` | `Boolean` | `false` | Пометка обязательности в заголовке |
|
|
347
|
+
| `isLoading` | `Boolean` | `false` | Индикатор загрузки в заголовке |
|
|
348
|
+
| `withSearch` | `Boolean` | `false` | Поле поиска вверху списка |
|
|
349
|
+
| `lang` | `String` | язык плагина | `"ru"` или `"en"` — надпись, поле поиска, «Ничего не найдено», подписи обоих ластиков |
|
|
350
|
+
|
|
351
|
+
События: `update:modelValue` — новый массив `id`; `changed` — после каждого
|
|
352
|
+
изменения выбора кликом по пункту или ластиком.
|
|
353
|
+
|
|
354
|
+
Клик по невыбранному пункту добавляет его `id` в конец массива, по выбранному —
|
|
355
|
+
убирает. Массив из пропа компонент не меняет: он отдаёт новый, порядок `id` не
|
|
356
|
+
сортирует. `id`, которых нет среди пунктов, при переключении других пунктов
|
|
357
|
+
остаются в массиве, в надписи не считаются и ластик сами не показывают;
|
|
358
|
+
ластик отдаёт `[]` — уходят и они. Не массив в `items`, в том числе `null`
|
|
359
|
+
и `undefined`, — пустой список, элементы-необъекты в нём пропускаются; `null`
|
|
360
|
+
и `undefined` в `modelValue` — ничего не выбрано.
|
|
361
|
+
|
|
362
|
+
На кнопке: пока выбранных среди `items` нет — пусто; один — его название;
|
|
363
|
+
несколько — «Выбрано: 3». Считаются все пункты, а не только найденные поиском.
|
|
364
|
+
Ластик виден, когда выбран хотя бы один пункт и список закрыт.
|
|
365
|
+
|
|
366
|
+
Выбор пункта — клик, Enter или пробел — закрывает список, фокус возвращается
|
|
367
|
+
на кнопку фильтра, а запрос поиска сбрасывается. `changed` уходит после
|
|
368
|
+
каждого выбора, и страница сразу перезапрашивает выдачу.
|
|
369
|
+
|
|
370
|
+
Список открывается так же, как у `SelectSingle`: в верхнем слое браузера, место,
|
|
371
|
+
высота, прокрутка и способы закрытия те же, фокус после закрытия возвращается
|
|
372
|
+
на кнопку. Отличия: галочка стоит у каждого выбранного пункта; пункт
|
|
373
|
+
сообщает скринридеру, выбран ли он (`aria-pressed`).
|
|
374
|
+
Как и у `SelectSingle`, без пунктов кнопки нет, заголовок остаётся. Пункты
|
|
375
|
+
пропали при открытом списке — список закрывается, запрос поиска сбрасывается,
|
|
376
|
+
а вернувшиеся пункты появляются с закрытым списком.
|
|
377
|
+
|
|
378
|
+
С клавиатуры, пока список открыт, всё как у `SelectSingle`: стрелки вверх и вниз
|
|
379
|
+
ведут фокус по пунктам по кругу, Enter или пробел переключают пункт и закрывают
|
|
380
|
+
список, Escape закрывает его без выбора. Если выбрано несколько пунктов,
|
|
381
|
+
отсчёт идёт от первого выбранного среди видимых. Мышь ведёт тот же фокус, что
|
|
382
|
+
и стрелки: движение по пункту ставит фокус на него, подсвечен всегда один пункт.
|
|
383
|
+
|
|
384
|
+
С `with-search` над пунктами стоит поле поиска: при прокрутке длинного списка
|
|
385
|
+
оно остаётся на месте. Имя пункта должно содержать запрос, регистр не важен,
|
|
386
|
+
пробелы по краям запроса отбрасываются. Если совпадений нет, вместо пунктов
|
|
387
|
+
строка «Ничего не найдено». Выбранные пункты, скрытые поиском, остаются
|
|
388
|
+
выбранными. Запрос не входит в `v-model`; он сбрасывается при каждом закрытии
|
|
389
|
+
списка, в том числе при выборе пункта. Ластик в поле очищает запрос. При
|
|
390
|
+
открытии списка фокус встаёт в поле; при загрузке страницы фокус в поле
|
|
391
|
+
не уходит. Без Popover API список виден всегда, и фокус в поле сам
|
|
392
|
+
не ставится. Пробел в поле печатает пробел, Enter ничего не делает и форму
|
|
393
|
+
не отправляет. Поле — первая остановка стрелок: из него вниз — первый пункт,
|
|
394
|
+
вверх — последний, с краёв пунктов — обратно в поле. Без совпадений стрелки
|
|
395
|
+
в поле ничего не делают. Пока список открыт, Tab и Shift+Tab ходят по кругу
|
|
396
|
+
внутри него: поле, ластик поля, пока запрос не пуст, пункты; наружу, на
|
|
397
|
+
страницу, фокус уходит после закрытия списка. Ластик поля входит в Tab, но не
|
|
398
|
+
в стрелки. Ластик на кнопке фильтра идёт в Tab сразу после неё.
|
|
399
|
+
Печатный символ и Backspace на пункте уходят в поле, поэтому набор не
|
|
400
|
+
пропадает, когда мышь увела фокус на пункт. Пока список открыт, панель не
|
|
401
|
+
становится уже, чем при открытии, а поле не двигается, сколько бы пунктов ни
|
|
402
|
+
убрал поиск: открытая вниз панель становится ниже вместе с найденным, открытая
|
|
403
|
+
вверх не становится ниже, и пустое место остаётся под пунктами, у кнопки.
|
|
404
|
+
|
|
320
405
|
### InfoPill
|
|
321
406
|
|
|
322
407
|
Пилюля, которая только показывает текст: статус, счётчик, флаг, пометку.
|
|
@@ -925,7 +1010,10 @@ rounded-lg`, `box-sizing: border-box`. Отступов у неё нет: фор
|
|
|
925
1010
|
| `HamburgerMenu` — подпись кнопки для скринридера | Открыть меню | Open menu |
|
|
926
1011
|
| `SelectDateInterval` — месяцы, дни недели, кнопки календарей | по-русски | in English |
|
|
927
1012
|
| `SelectDateInterval` — подсказки полей | от / до | from / to |
|
|
928
|
-
| Ластик `Search`, `RussianMobileFilter`, `SelectSingle` (язык плагина) и `SelectDateInterval` — подпись для скринридера | Очистить | Clear |
|
|
1013
|
+
| Ластик `Search`, `RussianMobileFilter`, `SelectSingle` (язык плагина), `SelectMultiple` (проп `lang`) и `SelectDateInterval` — подпись для скринридера | Очистить | Clear |
|
|
1014
|
+
| `SelectMultiple` — надпись при нескольких выбранных | Выбрано: N | Selected: N |
|
|
1015
|
+
| `SelectMultiple` — подсказка и имя поля поиска | Поиск | Search |
|
|
1016
|
+
| `SelectMultiple` — нет совпадений | Ничего не найдено | Nothing found |
|
|
929
1017
|
| `DataTable` — пагинация | Предыдущая / Следующая / Показаны результаты X - Y из Z | Previous / Next / Showing X - Y of Z results |
|
|
930
1018
|
| `PageTabs` — имя навигации для скринридера | Закладки | Tabs |
|
|
931
1019
|
| `PageCard` — доступное имя крестика | Назад | Back |
|
|
@@ -940,7 +1028,20 @@ rounded-lg`, `box-sizing: border-box`. Отступов у неё нет: фор
|
|
|
940
1028
|
|
|
941
1029
|
Кнопки и ссылки компонентов нажимаются расширениями клавиатурной навигации —
|
|
942
1030
|
Vimium, Vimari, Vimlike — по их подсказкам, как мышью; подсказка у каждой
|
|
943
|
-
кнопки одна и стоит на всей кнопке.
|
|
1031
|
+
кнопки одна и стоит на всей кнопке. Ластики фильтров входят в порядок Tab
|
|
1032
|
+
и нажимаются Enter и пробелом; кольцо фокуса — вокруг крестика.
|
|
1033
|
+
После ластика, нажатого с клавиатуры, фокус переходит на поле или кнопку
|
|
1034
|
+
этого фильтра: ластик пропадает, и без этого фокус упал бы на страницу.
|
|
1035
|
+
При касании и клике мышью фокус остаётся как раньше.
|
|
1036
|
+
|
|
1037
|
+
Фокус у всех компонентов пакета выглядит одинаково, как у `FormInput`: линия
|
|
1038
|
+
1px `blue-300` по краю элемента и ореол 3px `blue-200` с прозрачностью 50%.
|
|
1039
|
+
Вид задан одной утилитой `focus-ring` в `src/styles/index.css`, компоненты
|
|
1040
|
+
выбирают только момент. Поля, крестик `NotificationMessage`, кнопки
|
|
1041
|
+
`ConfirmationModal` и `DropdownButtonWithAction` показывают фокус при любом
|
|
1042
|
+
его появлении, в том числе после клика мышью; остальные кнопки и ссылки —
|
|
1043
|
+
только с клавиатуры. Стрелки месяцев и подпись месяца в календаре `PickDay`
|
|
1044
|
+
берут тот же вид, когда фокус в них с клавиатуры.
|
|
944
1045
|
|
|
945
1046
|
Vimlike (Safari на iPhone, iPad и Mac) считает кнопкой любой элемент
|
|
946
1047
|
с `cursor: pointer` и из вложенных таких элементов оставляет самый глубокий.
|
|
@@ -954,7 +1055,7 @@ Vimlike (Safari на iPhone, iPad и Mac) считает кнопкой любо
|
|
|
954
1055
|
считал бы кнопкой вместо неё. В поле по-прежнему можно перейти Tab и набрать
|
|
955
1056
|
дату.
|
|
956
1057
|
|
|
957
|
-
Подсказки Vimlike в открытых меню,
|
|
1058
|
+
Подсказки Vimlike в открытых меню, списках `SelectSingle` и `SelectMultiple` и календарях
|
|
958
1059
|
`SelectDateInterval` не видны: Vimlike рисует их под верхним слоем браузера,
|
|
959
1060
|
в котором открываются эти панели. Vimium выводит свои подсказки в верхний
|
|
960
1061
|
слой, и у него такой проблемы нет. В Vimlike панель открывают подсказкой её
|
|
@@ -1065,7 +1166,7 @@ Inertia SSR), а серверная разметка гидратируется
|
|
|
1065
1166
|
|
|
1066
1167
|
npm run playground
|
|
1067
1168
|
|
|
1068
|
-
Поднимает демо-страницы со всеми
|
|
1169
|
+
Поднимает демо-страницы со всеми девятнадцатью компонентами в двух окружениях:
|
|
1069
1170
|
голом (без Tailwind и стилей приложения) и в окружении приложения (с
|
|
1070
1171
|
Tailwind, `@tailwindcss/forms` и типографикой, как у потребителя). Это
|
|
1071
1172
|
основной способ посмотреть, как компоненты выглядят и ведут себя, а не
|