@boobooking/dashboard-ui-components 0.7.0 → 0.9.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`, `PageCard` и плагин `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,125 @@ 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
+ ### PageCard
375
+
376
+ Карточка отдельной страницы — формы или просмотра записи — по центру с
377
+ крестиком «назад по истории».
378
+
379
+ <page-card class="px-4 pt-4 sm:px-6 sm:pt-6">
380
+ <h3 class="pr-(--bb-closer-space) text-lg font-medium">Создание администратора</h3>
381
+ …поля формы…
382
+ </page-card>
383
+
384
+ Страница просмотра, у секций которой свои отступы:
385
+
386
+ <page-card>
387
+ <div class="px-4 py-5 border-b border-gray-200 sm:px-6">
388
+ <h3 class="pr-(--bb-closer-space) text-lg font-medium">{{ name }}</h3>
389
+ </div>
390
+ <div class="overflow-hidden sm:rounded-b-lg">…строки…</div>
391
+ </page-card>
392
+
393
+ Карточка — `relative my-6 mx-auto bg-white shadow-xl sm:max-w-xl
394
+ sm:rounded-lg`, `box-sizing: border-box`. Отступов у неё нет: форма передаёт
395
+ их классом на корень, страница просмотра — не передаёт. Классы и атрибуты
396
+ приложения попадают на корень и сильнее классов пакета. Ресет пакета на
397
+ карточку и её содержимое не распространяется: разметка страницы, в том числе
398
+ поля `@tailwindcss/forms`, выглядит так же, как вне карточки.
399
+
400
+ Крестик показан, если в истории вкладки больше одной записи
401
+ (`history.length > 1`, значение читается при создании компонента), и по клику
402
+ возвращает назад (`history.back()`). `PageCard` читает историю браузера при
403
+ создании компонента, поэтому ему нужен браузер: серверный рендеринг (SSR) не
404
+ поддерживается. `history.length` считает и записи впереди
405
+ текущей, поэтому это не гарантия, что назад есть куда. От `md` крестик стоит
406
+ снаружи карточки, на `1rem` правее её края; ниже `md` — в её правом верхнем
407
+ углу. Порог рассчитан на карточку по центру области на всю ширину страницы: в
408
+ узкой колонке или рядом с боковой панелью места снаружи может не хватить. Он
409
+ рассчитан и на ширину карточки по умолчанию (`max-w-xl`, 36rem): если передать
410
+ классом на корень более широкую, места снаружи тоже может не хватить.
411
+
412
+ Заголовок оставляет место под крестик правым отступом из переменной
413
+ `--bb-closer-space`: `3.5rem`, пока крестик в углу, `0` — когда он снаружи или
414
+ его нет. В Tailwind это `pr-(--bb-closer-space)`; без Tailwind 4 — обычный CSS
415
+ `padding-right: var(--bb-closer-space)`, а в Tailwind 3 —
416
+ `pr-[var(--bb-closer-space)]`. Вне `PageCard` отступ равен нулю.
417
+
418
+ Карточка не обрезает содержимое, как `Modal`: выпадающие списки и календари
419
+ могут выходить за её край. Блок со своим фоном у края карточки скругляет свои
420
+ углы сам — например, нижний блок строк: `overflow-hidden sm:rounded-b-lg`.
421
+
422
+ Крестик доступен с клавиатуры: Tab, Enter, пробел; в порядке табуляции крестик
423
+ идёт после содержимого карточки; при фокусе с клавиатуры
424
+ вокруг него кольцо. Доступное имя — «Назад» / «Back».
425
+
426
+ | Проп | Тип | По умолчанию | Описание |
427
+ | --- | --- | --- | --- |
428
+ | `lang` | `String` | язык плагина | `"ru"` или `"en"` |
429
+
430
+ Событий нет.
431
+
432
+ ## Языки
433
+
434
+ Тексты пакета есть на русском и английском. Язык компонента — проп `lang`, если
435
+ он задан, иначе язык плагина `dashboardUi`, иначе русский. Явно переданный текст
436
+ главнее языка: `cancel-button-text` у `ConfirmationModal`, `title` у
437
+ `DownloadLink`.
438
+
439
+ | Компонент | `ru` | `en` |
440
+ | --- | --- | --- |
441
+ | `ConfirmationModal` — кнопка отмены | Отмена | Cancel |
442
+ | `DownloadLink` — подпись | Скачать | Download |
443
+ | `DropdownButtonWithAction` — подпись стрелки для скринридера | Открыть меню | Open menu |
444
+ | `PickDay` — месяцы, дни недели, кнопки календаря | по-русски | in English |
445
+ | `SelectDateInterval` — подсказки полей | от / до | from / to |
446
+ | `Pagination` | Предыдущая / Следующая / Показаны результаты X - Y из Z | Previous / Next / Showing X - Y of Z results |
447
+ | `PageCard` — доступное имя крестика | Назад | Back |
448
+
449
+ Формат даты — `дд.мм.гггг` в обоих языках: это формат значения, а не текст.
450
+ Неделя начинается с понедельника. Календарь `PickDay` берёт язык при
451
+ монтировании: смена языка после монтирования в нём не отражается.
452
+
305
453
  ## Правила API пакета
306
454
 
307
455
  Компонент, добавляемый в пакет, следует тем же правилам, что и уже
@@ -332,6 +480,15 @@ ConfirmationModal нет v-model».
332
480
  префикса не сгенерируется. Классы в `:class` пишутся литералами — ключами
333
481
  объекта, ветками тернарного оператора, элементами массива. Оба правила
334
482
  проверяет `tests/utilityPrefix.test.js`.
483
+ - Тексты интерфейса — только в `src/i18n.js`, в словарях `ru` и `en` с
484
+ одинаковыми ключами; компонент берёт их через миксин `withLang`
485
+ (`this.texts`) и получает проп `lang`.
486
+ - Ссылка компонента — настоящий `<a href>`; обычный клик — через
487
+ `followLink($event, href)` миксина `withNavigation`, который отдаёт его
488
+ `navigate` плагина. Ни Inertia, ни роутер пакет не импортирует. Исключение —
489
+ `DownloadLink`: это обычная ссылка браузера, скачивающая файл, и через
490
+ `navigate` она не идёт. Через `navigate` ходят `Pagination` и
491
+ `NavigationMenuElement`.
335
492
 
336
493
  ## Почему у Popup и Dot нет события changed
337
494
 
@@ -366,7 +523,7 @@ ConfirmationModal нет v-model».
366
523
 
367
524
  npm run playground
368
525
 
369
- Поднимает демо-страницы со всеми четырнадцатью компонентами в двух окружениях:
526
+ Поднимает демо-страницы со всеми семнадцатью компонентами в двух окружениях:
370
527
  голом (без Tailwind и стилей приложения) и в окружении приложения (с
371
528
  Tailwind, `@tailwindcss/forms` и типографикой, как у потребителя). Это
372
529
  основной способ посмотреть, как компоненты выглядят и ведут себя, а не
@@ -379,8 +536,8 @@ Tailwind, `@tailwindcss/forms` и типографикой, как у потре
379
536
  которое типографику не задаёт, компоненты отрисуются браузерными умолчаниями:
380
537
  рабочими, но чужими на вид.
381
538
 
382
- Компоненты русскоязычные: названия месяцев, подписи и правила номера телефона
383
- зашиты.
539
+ Правила номера телефона в `RussianMobileFilter` — российские; язык текстов
540
+ задаётся, см. «Языки».
384
541
 
385
542
  ## Ограничение
386
543