@boobooking/dashboard-ui-components 0.6.0 → 0.8.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
@@ -13,6 +13,30 @@ import '@boobooking/dashboard-ui-components/style.css'
13
13
 
14
14
  Стили пакета подключаются **до** стилей приложения.
15
15
 
16
+ ### Подключение к приложению
17
+
18
+ Плагин `dashboardUi` задаёт язык и переход по ссылкам пакета. Оба параметра
19
+ необязательны; без плагина компоненты русскоязычные, а ссылки — обычные `<a>`.
20
+
21
+ ```js
22
+ import { dashboardUi } from '@boobooking/dashboard-ui-components'
23
+ import { router } from '@inertiajs/vue3'
24
+
25
+ createApp(App).use(dashboardUi, {
26
+ lang: 'en',
27
+ navigate: (href) => router.visit(href),
28
+ })
29
+ ```
30
+
31
+ - `lang` — `'ru'` (по умолчанию) или `'en'`; другое значение — ошибка в `app.use`.
32
+ - `navigate(href)` — переход приложения по адресу: для Inertia
33
+ `router.visit(href)`, для Vue Router `router.push(href)`. Компоненты рисуют
34
+ настоящий `<a href>` и отдают `navigate` только обычный клик левой кнопкой;
35
+ клики с Ctrl/Cmd/Shift/Alt, средней кнопкой и ссылки с `target` остаются
36
+ браузеру. Без `navigate` браузер идёт по ссылке сам.
37
+
38
+ `navigate` получает адрес ровно таким, каким он лежит в компоненте: `Pagination` отдаёт `links` Laravel как есть, а это абсолютные URL. С Vue Router приложение само превращает их в маршрут, например `new URL(href).pathname + search`, и только потом зовёт `router.push`.
39
+
16
40
  ## Требования
17
41
 
18
42
  Vue не ниже 3.5, ESM, сборщик, умеющий импорт CSS из пакета. Версия 3.5 нужна
@@ -24,10 +48,11 @@ Tailwind, `@tailwindcss/forms`, Inertia и какие-либо токены в C
24
48
 
25
49
  ## Компоненты
26
50
 
27
- Пакет экспортирует четырнадцать компонентов: `Popup`, `Dot`, `PickDay`,
51
+ Пакет экспортирует шестнадцать компонентов: `Popup`, `Dot`, `PickDay`,
28
52
  `RussianMobileFilter`, `Search`, `SelectDateInterval`, `SelectSingle`,
29
53
  `SmallBadge`, `ErrorMessages`, `Closer`, `DownloadLink`, `Modal`,
30
- `ConfirmationModal`, `DropdownButtonWithAction`. В архив пакета
54
+ `ConfirmationModal`, `DropdownButtonWithAction`, `Pagination`,
55
+ `NavigationMenuElement` и плагин `dashboardUi`. В архив пакета
31
56
  (`files: ["dist"]`) исходники не
32
57
  попадают, поэтому контракт каждого компонента — здесь и в playground, а не в
33
58
  исходном коде.
@@ -79,6 +104,7 @@ Tailwind, `@tailwindcss/forms`, Inertia и какие-либо токены в C
79
104
  | `modelValue` | `String` | `""` | Текущая дата |
80
105
  | `withEraser` | `Boolean` | `true` | Показывать ли ластик очистки |
81
106
  | `placeholderText` | `String` | `""` | Текст подсказки в пустом поле |
107
+ | `lang` | `String` | язык плагина | `"ru"` или `"en"`; календарь берёт язык при монтировании |
82
108
 
83
109
  События: `update:modelValue` — при выборе даты в календаре и при очистке
84
110
  (пустой строкой); `changed` — в тех же двух случаях, для использования наравне
@@ -144,6 +170,7 @@ Tailwind, `@tailwindcss/forms`, Inertia и какие-либо токены в C
144
170
  | `header` | `String` | обязателен | Подпись поля |
145
171
  | `isRequired` | `Boolean` | `false` | Пометка обязательности в заголовке |
146
172
  | `isLoading` | `Boolean` | `false` | Индикатор загрузки в заголовке |
173
+ | `lang` | `String` | язык плагина | `"ru"` или `"en"`; действует и на подсказки полей, и на оба календаря |
147
174
 
148
175
  События: `update:dateFrom`, `update:dateTo` — на каждый выбор в
149
176
  соответствующем `PickDay`; `changed` — когда новое значение отличается от
@@ -218,7 +245,8 @@ Tailwind, `@tailwindcss/forms`, Inertia и какие-либо токены в C
218
245
  | Проп | Тип | По умолчанию | Описание |
219
246
  | --- | --- | --- | --- |
220
247
  | `url` | `String` | обязателен | Адрес файла |
221
- | `title` | `String` | `"Скачать"` | Подпись и всплывающая подсказка |
248
+ | `title` | `String` | `null` | Подпись и всплывающая подсказка; без него — «Скачать» / «Download» по языку |
249
+ | `lang` | `String` | язык плагина | `"ru"` или `"en"` |
222
250
 
223
251
  Событий нет.
224
252
 
@@ -254,6 +282,12 @@ Escape: видимостью управляет родитель, как у `Con
254
282
  `<modal>` попадают на полноэкранный корень, а не на панель: размер панели и
255
283
  атрибуты диалога вроде `aria-describedby` снаружи не задаются.
256
284
 
285
+ Панель не обрезает содержимое, чтобы выпадающие списки и календари внутри
286
+ модалки могли выходить за её край. Поэтому блок слота со своим фоном у края
287
+ панели сам скругляет внешние углы — верхний `rounded-t-lg`, нижний
288
+ `rounded-b-lg`, — иначе его квадратные углы закроют скругление панели. Так
289
+ сделано у `ConfirmationModal`.
290
+
257
291
  ### ConfirmationModal
258
292
 
259
293
  Модалка подтверждения действия: заголовок, текст, кнопка действия и кнопка
@@ -275,8 +309,9 @@ Escape: видимостью управляет родитель, как у `Con
275
309
  | `type` | `String` | `"warning"` | `"warning"` (жёлтая) или `"dangerous"` (красная) |
276
310
  | `confirmationHeading` | `String` | `""` | Заголовок |
277
311
  | `confirmationText` | `String` | `""` | Текст под заголовком |
278
- | `cancelButtonText` | `String` | `"Отмена"` | Подпись кнопки отмены |
312
+ | `cancelButtonText` | `String` | `null` | Подпись кнопки отмены; без него — «Отмена» / «Cancel» по языку |
279
313
  | `actionButtonText` | `String` | обязателен | Подпись кнопки действия |
314
+ | `lang` | `String` | язык плагина | `"ru"` или `"en"` |
280
315
 
281
316
  События: `actionConfirmed` — по кнопке действия, `actionCanceled` — по кнопке
282
317
  отмены. Ни одна из кнопок модалку не закрывает — см. раздел «Почему у
@@ -296,12 +331,66 @@ ConfirmationModal нет v-model».
296
331
  | Проп | Тип | По умолчанию | Описание |
297
332
  | --- | --- | --- | --- |
298
333
  | `modelValue` | `Boolean` | `false` | Открыто ли меню |
334
+ | `lang` | `String` | язык плагина | `"ru"` или `"en"` |
299
335
 
300
336
  Событие: `update:modelValue` — только когда меню открыл или закрыл сам
301
337
  компонент: клик по стрелке, клик вне меню, Escape. Значение, пришедшее от
302
338
  родителя, компонент принимает молча: ответное событие вернуло бы родителю его
303
339
  же решение. Без `v-model` меню работает само по себе.
304
340
 
341
+ ### Pagination
342
+
343
+ Переход на предыдущую и следующую страницу и строка «Показаны результаты X - Y
344
+ из Z» для списков на Laravel API Resource.
345
+
346
+ <pagination class="mt-6" :links="orders.links" :meta="orders.meta" />
347
+
348
+ | Проп | Тип | По умолчанию | Описание |
349
+ | --- | --- | --- | --- |
350
+ | `links` | `Object` | обязателен | `{ prev, next }` — адреса соседних страниц или `null` |
351
+ | `meta` | `Object` | обязателен | `{ from, to, total }` |
352
+ | `lang` | `String` | язык плагина | `"ru"` или `"en"` |
353
+
354
+ Если записей нет — `meta` не задан или `meta.total` не больше нуля, —
355
+ компонент ничего не рисует. Строка «Показаны результаты» — только когда в
356
+ `meta` есть числовые `from` и `to`. Кнопка — только при непустом адресе в
357
+ `links.prev` / `links.next`; при `links: null` остаётся одна строка
358
+ результатов. Ссылки — через `navigate` плагина. Событий нет.
359
+
360
+ ### NavigationMenuElement
361
+
362
+ Пункт меню шапки: ссылка с подчёркиванием активного раздела.
363
+
364
+ <navigation-menu-element name="Заказы" :url="route('orders')" :is-active="isOrders" />
365
+
366
+ | Проп | Тип | По умолчанию | Описание |
367
+ | --- | --- | --- | --- |
368
+ | `url` | `String` | обязателен | Адрес раздела |
369
+ | `name` | `String` | обязателен | Подпись |
370
+ | `isActive` | `Boolean` | `false` | Активный раздел |
371
+
372
+ Ссылка — через `navigate` плагина. Событий нет.
373
+
374
+ ## Языки
375
+
376
+ Тексты пакета есть на русском и английском. Язык компонента — проп `lang`, если
377
+ он задан, иначе язык плагина `dashboardUi`, иначе русский. Явно переданный текст
378
+ главнее языка: `cancel-button-text` у `ConfirmationModal`, `title` у
379
+ `DownloadLink`.
380
+
381
+ | Компонент | `ru` | `en` |
382
+ | --- | --- | --- |
383
+ | `ConfirmationModal` — кнопка отмены | Отмена | Cancel |
384
+ | `DownloadLink` — подпись | Скачать | Download |
385
+ | `DropdownButtonWithAction` — подпись стрелки для скринридера | Открыть меню | Open menu |
386
+ | `PickDay` — месяцы, дни недели, кнопки календаря | по-русски | in English |
387
+ | `SelectDateInterval` — подсказки полей | от / до | from / to |
388
+ | `Pagination` | Предыдущая / Следующая / Показаны результаты X - Y из Z | Previous / Next / Showing X - Y of Z results |
389
+
390
+ Формат даты — `дд.мм.гггг` в обоих языках: это формат значения, а не текст.
391
+ Неделя начинается с понедельника. Календарь `PickDay` берёт язык при
392
+ монтировании: смена языка после монтирования в нём не отражается.
393
+
305
394
  ## Правила API пакета
306
395
 
307
396
  Компонент, добавляемый в пакет, следует тем же правилам, что и уже
@@ -326,6 +415,21 @@ ConfirmationModal нет v-model».
326
415
  где ждут строку, объект или массив, он считает пустыми: пустой строкой,
327
416
  отсутствием сообщений, пустым списком. Для обязательного пропа Vue при этом
328
417
  предупредит о несовпадении типа, но компонент отрисуется.
418
+ - Каждая утилита в разметке компонента пишется с префиксом `bb:` — в
419
+ `class`, в `:class` и в пропсах `*-class` у `<transition>`; варианты идут
420
+ после префикса: `bb:sm:inline-block`, `bb:hover:bg-red-700`. Утилита без
421
+ префикса не сгенерируется. Классы в `:class` пишутся литералами — ключами
422
+ объекта, ветками тернарного оператора, элементами массива. Оба правила
423
+ проверяет `tests/utilityPrefix.test.js`.
424
+ - Тексты интерфейса — только в `src/i18n.js`, в словарях `ru` и `en` с
425
+ одинаковыми ключами; компонент берёт их через миксин `withLang`
426
+ (`this.texts`) и получает проп `lang`.
427
+ - Ссылка компонента — настоящий `<a href>`; обычный клик — через
428
+ `followLink($event, href)` миксина `withNavigation`, который отдаёт его
429
+ `navigate` плагина. Ни Inertia, ни роутер пакет не импортирует. Исключение —
430
+ `DownloadLink`: это обычная ссылка браузера, скачивающая файл, и через
431
+ `navigate` она не идёт. Через `navigate` ходят `Pagination` и
432
+ `NavigationMenuElement`.
329
433
 
330
434
  ## Почему у Popup и Dot нет события changed
331
435
 
@@ -360,7 +464,7 @@ ConfirmationModal нет v-model».
360
464
 
361
465
  npm run playground
362
466
 
363
- Поднимает демо-страницы со всеми четырнадцатью компонентами в двух окружениях:
467
+ Поднимает демо-страницы со всеми шестнадцатью компонентами в двух окружениях:
364
468
  голом (без Tailwind и стилей приложения) и в окружении приложения (с
365
469
  Tailwind, `@tailwindcss/forms` и типографикой, как у потребителя). Это
366
470
  основной способ посмотреть, как компоненты выглядят и ведут себя, а не
@@ -373,15 +477,30 @@ Tailwind, `@tailwindcss/forms` и типографикой, как у потре
373
477
  которое типографику не задаёт, компоненты отрисуются браузерными умолчаниями:
374
478
  рабочими, но чужими на вид.
375
479
 
376
- Компоненты русскоязычные: названия месяцев, подписи и правила номера телефона
377
- зашиты.
480
+ Правила номера телефона в `RussianMobileFilter` — российские; язык текстов
481
+ задаётся, см. «Языки».
378
482
 
379
483
  ## Ограничение
380
484
 
381
- Пакет отдаёт скомпилированные утилиты Tailwind — те же имена классов, что
382
- генерирует Tailwind приложения. При стоковой палитре правила совпадают. Если
383
- приложение переопределит стоковый цвет, одноимённые правила столкнутся и
384
- победит подключённое позже, то есть компоненты возьмут палитру приложения.
485
+ Утилиты пакета собраны с префиксом `bb`: классы внутри компонентов — вида
486
+ `bb:flex` и `bb:sm:inline-block`, переменные темы — `--bb-*`. Tailwind
487
+ приложения таких классов не генерирует, поэтому одноимённых правил у пакета и
488
+ приложения нет: вид компонентов не зависит ни от того, какие утилиты
489
+ генерирует приложение, ни от его палитры. Общими остаются только служебные
490
+ переменные Tailwind `--tw-*` с их `@property` — на одной версии Tailwind у
491
+ пакета и приложения они объявлены одинаково — и глобальный `@keyframes pulse`
492
+ (его использует `bb:animate-pulse` у `Dot`): если приложение объявит свой
493
+ `pulse`, победит тот, что подключён позже.
494
+
495
+ Порядок «стили пакета до стилей приложения» по-прежнему нужен: классы,
496
+ которые приложение передаёт на корень компонента, — его собственные
497
+ утилиты, и при одинаковом свойстве они побеждают, потому что подключены
498
+ позже.
499
+
500
+ С версии 0.7.0 классы внутри компонентов — `bb:*`. Если приложение
501
+ обращалось к внутренностям компонентов по классам в своём CSS или тестах,
502
+ такие обращения перестанут находить элементы: внутренние классы в контракт
503
+ пакета не входят.
385
504
 
386
505
  Ресет пакета распространяется и на содержимое слотов — разметку приложения
387
506
  внутри `Popup`, `DropdownButtonWithAction` и `Modal`. Ресет лежит в слое