@rt-tools/ui-kit-v2 0.1.0 → 0.4.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.
Files changed (117) hide show
  1. package/README.md +25 -16
  2. package/fesm2022/rt-tools-ui-kit-v2.mjs +786 -1504
  3. package/fesm2022/rt-tools-ui-kit-v2.mjs.map +1 -1
  4. package/package.json +1 -2
  5. package/rt-tools-ui-kit-v2-0.4.0.tgz +0 -0
  6. package/src/lib/components/CONTEXT.md +49 -0
  7. package/src/lib/components/aside/CONTEXT.md +51 -0
  8. package/src/lib/components/aside/_rt-aside-overlay.scss +88 -0
  9. package/src/lib/components/aside/rt-aside.component.scss +19 -94
  10. package/src/lib/components/aside-section/CONTEXT.md +26 -0
  11. package/src/lib/components/autocomplete/CONTEXT.md +58 -0
  12. package/src/lib/components/bar-list/CONTEXT.md +27 -0
  13. package/src/lib/components/bar-list/rt-bar-list.component.scss +5 -2
  14. package/src/lib/components/bottom-sheet/CONTEXT.md +54 -0
  15. package/src/lib/components/bottom-sheet/rt-bottom-sheet.component.scss +53 -53
  16. package/src/lib/components/button/CONTEXT.md +53 -0
  17. package/src/lib/components/button/rt-button.directive.scss +20 -0
  18. package/src/lib/components/calendar/CONTEXT.md +41 -0
  19. package/src/lib/components/calendar/rt-calendar.component.scss +96 -99
  20. package/src/lib/components/card/CONTEXT.md +34 -0
  21. package/src/lib/components/card/rt-card.component.scss +5 -2
  22. package/src/lib/components/chat/CONTEXT.md +41 -0
  23. package/src/lib/components/checkbox/CONTEXT.md +37 -0
  24. package/src/lib/components/checkbox/rt-checkbox.component.scss +13 -4
  25. package/src/lib/components/collapsible-text/CONTEXT.md +29 -0
  26. package/src/lib/components/confirm-popover/CONTEXT.md +47 -0
  27. package/src/lib/components/container/CONTEXT.md +42 -0
  28. package/src/lib/components/container/rt-container.component.scss +5 -69
  29. package/src/lib/components/counter/CONTEXT.md +40 -0
  30. package/src/lib/components/counter/rt-counter.component.scss +10 -9
  31. package/src/lib/components/counter-row/CONTEXT.md +24 -0
  32. package/src/lib/components/counter-row/rt-counter-row.component.scss +23 -22
  33. package/src/lib/components/date-picker/CONTEXT.md +41 -0
  34. package/src/lib/components/delta-view/CONTEXT.md +31 -0
  35. package/src/lib/components/detail-list/CONTEXT.md +29 -0
  36. package/src/lib/components/dialog/CONTEXT.md +50 -0
  37. package/src/lib/components/dialog/footer/rt-dialog-footer.component.scss +20 -9
  38. package/src/lib/components/dialog/header/rt-dialog-header.component.scss +27 -15
  39. package/src/lib/components/dialog/rt-dialog.component.scss +6 -2
  40. package/src/lib/components/download-link/CONTEXT.md +26 -0
  41. package/src/lib/components/download-link/rt-download-link.component.scss +13 -0
  42. package/src/lib/components/empty-state/CONTEXT.md +35 -0
  43. package/src/lib/components/field/CONTEXT.md +72 -0
  44. package/src/lib/components/file-card/CONTEXT.md +28 -0
  45. package/src/lib/components/file-drop/CONTEXT.md +39 -0
  46. package/src/lib/components/file-input/CONTEXT.md +36 -0
  47. package/src/lib/components/file-list/CONTEXT.md +15 -0
  48. package/src/lib/components/filter-control/CONTEXT.md +33 -0
  49. package/src/lib/components/form-control/CONTEXT.md +50 -0
  50. package/src/lib/components/header/CONTEXT.md +36 -0
  51. package/src/lib/components/icon/CONTEXT.md +46 -0
  52. package/src/lib/components/icon/rt-icon.component.scss +3 -5
  53. package/src/lib/components/icon-button/CONTEXT.md +49 -0
  54. package/src/lib/components/icon-button/rt-icon-button.component.scss +14 -1
  55. package/src/lib/components/info-item/CONTEXT.md +30 -0
  56. package/src/lib/components/input/CONTEXT.md +47 -0
  57. package/src/lib/components/input-number/CONTEXT.md +52 -0
  58. package/src/lib/components/live-badge/CONTEXT.md +31 -0
  59. package/src/lib/components/live-badge/rt-live-badge.component.scss +5 -2
  60. package/src/lib/components/logo/CONTEXT.md +42 -0
  61. package/src/lib/components/logo/rt-logo.component.scss +4 -6
  62. package/src/lib/components/menu/CONTEXT.md +65 -0
  63. package/src/lib/components/message/CONTEXT.md +35 -0
  64. package/src/lib/components/message/rt-message.component.scss +5 -2
  65. package/src/lib/components/message-composer/CONTEXT.md +46 -0
  66. package/src/lib/components/money-list/CONTEXT.md +32 -0
  67. package/src/lib/components/multiselect/CONTEXT.md +43 -0
  68. package/src/lib/components/night-grid/CONTEXT.md +31 -0
  69. package/src/lib/components/night-grid/rt-night-grid.component.scss +5 -2
  70. package/src/lib/components/note/CONTEXT.md +27 -0
  71. package/src/lib/components/notifications-bell/CONTEXT.md +29 -0
  72. package/src/lib/components/page-header/CONTEXT.md +33 -0
  73. package/src/lib/components/pagination/CONTEXT.md +43 -0
  74. package/src/lib/components/photo-viewer/CONTEXT.md +30 -0
  75. package/src/lib/components/photo-viewer/rt-photo-viewer.component.scss +95 -96
  76. package/src/lib/components/popover/CONTEXT.md +54 -0
  77. package/src/lib/components/rich-editor/CONTEXT.md +36 -0
  78. package/src/lib/components/section-nav/CONTEXT.md +27 -0
  79. package/src/lib/components/section-nav/rt-section-nav.component.scss +7 -1
  80. package/src/lib/components/select/CONTEXT.md +54 -0
  81. package/src/lib/components/skeleton/CONTEXT.md +41 -0
  82. package/src/lib/components/skeleton-wrapper/CONTEXT.md +24 -0
  83. package/src/lib/components/skeleton-wrapper/rt-skeleton-wrapper.component.scss +5 -1
  84. package/src/lib/components/spinner/CONTEXT.md +39 -0
  85. package/src/lib/components/split-button/CONTEXT.md +39 -0
  86. package/src/lib/components/split-button/rt-split-button.component.scss +13 -0
  87. package/src/lib/components/stat-tile/CONTEXT.md +35 -0
  88. package/src/lib/components/stat-tile/rt-stat-tile.component.scss +5 -2
  89. package/src/lib/components/stepper/CONTEXT.md +36 -0
  90. package/src/lib/components/stepper/rt-stepper.component.scss +5 -2
  91. package/src/lib/components/table/CONTEXT.md +53 -0
  92. package/src/lib/components/table/settings-aside/rt-table-settings-aside.component.scss +4 -2
  93. package/src/lib/components/table/settings-panel/rt-table-settings-panel.component.scss +1 -1
  94. package/src/lib/components/tabs/CONTEXT.md +56 -0
  95. package/src/lib/components/tag/CONTEXT.md +47 -0
  96. package/src/lib/components/tag/rt-tag.component.scss +5 -2
  97. package/src/lib/components/textarea/CONTEXT.md +38 -0
  98. package/src/lib/components/theme-toggle/CONTEXT.md +28 -0
  99. package/src/lib/components/theme-toggle/rt-theme-toggle.component.scss +5 -1
  100. package/src/lib/components/thread-list/CONTEXT.md +42 -0
  101. package/src/lib/components/timeline/CONTEXT.md +33 -0
  102. package/src/lib/components/timeline/rt-timeline.component.scss +5 -2
  103. package/src/lib/components/toast/CONTEXT.md +53 -0
  104. package/src/lib/components/toggle-button-group/CONTEXT.md +38 -0
  105. package/src/lib/components/toggle-button-group/rt-toggle-button-group.component.scss +12 -7
  106. package/src/lib/components/toggle-switch/CONTEXT.md +35 -0
  107. package/src/lib/components/toggle-switch/rt-toggle-switch.component.scss +13 -4
  108. package/src/lib/components/toolbar/CONTEXT.md +22 -0
  109. package/src/lib/components/tooltip/CONTEXT.md +34 -0
  110. package/src/lib/components/welcome-dialog/CONTEXT.md +20 -0
  111. package/src/lib/components/welcome-dialog/rt-welcome-dialog.component.scss +6 -2
  112. package/src/lib/components/workspace/CONTEXT.md +46 -0
  113. package/src/lib/components/workspace-details/CONTEXT.md +42 -0
  114. package/src/styles/_semantic.scss +11 -2
  115. package/styles/tokens.css +26 -1
  116. package/types/rt-tools-ui-kit-v2.d.ts +365 -87
  117. package/rt-tools-ui-kit-v2-0.1.0.tgz +0 -0
@@ -0,0 +1,22 @@
1
+ # `rt-toolbar`
2
+
3
+ Полоса действий с тремя слотами. Слоты объявляются директивами на `ng-template`.
4
+
5
+ ```html
6
+ <rt-toolbar dense>
7
+ <ng-template rtToolbarLeft><rt-icon-button icon="arrow-left" ariaLabel="Назад" /></ng-template>
8
+ <ng-template rtToolbarCenter><h3>Заявка №12</h3></ng-template>
9
+ <ng-template rtToolbarRight><rt-menu … /></ng-template>
10
+ </rt-toolbar>
11
+ ```
12
+
13
+ | вход | тип | умолчание |
14
+ | ------- | --------- | --------- |
15
+ | `dense` | `boolean` | `false` |
16
+
17
+ Выходов нет.
18
+
19
+ ## Главное, что нужно знать
20
+
21
+ **Без единого слота панель не рисуется вовсе** — ни одного узла в DOM. Необъявленный слот тоже
22
+ не создаёт пустой полосы: пустая полоса занимала бы место и растягивала соседние.
@@ -0,0 +1,34 @@
1
+ # `[rtTooltip]`
2
+
3
+ ```html
4
+ <button rtButton rtTooltipPlacement="top" [rtTooltip]="'Удалить строку'">…</button>
5
+ <rt-icon-button icon="ico-trash" ariaLabel="Удалить" tooltip="Удалить" />
6
+ ```
7
+
8
+ | вход | тип | умолчание |
9
+ | -------------------- | ----------------------------- | --------- |
10
+ | `rtTooltip` | `string \| null \| undefined` | `''` |
11
+ | `rtTooltipPlacement` | `'top' \| 'bottom'` | `'top'` |
12
+
13
+ Выходов нет. Панель — `rt-tooltip` в оверлее CDK, `role="tooltip"`.
14
+
15
+ ## Главное, что нужно знать
16
+
17
+ **Пустой текст выключает директиву целиком.** `''`, пробелы, `null`, `undefined` — всё это
18
+ no-op, а не пустая панель под курсором. Поэтому директиву вешают на иконочные кнопки
19
+ безусловно и «включают», выставив строку. Вход принимает `null`/`undefined` и нормализует их
20
+ сам — так `[rtTooltip]="value | date"` не ломает строгую типизацию шаблона.
21
+
22
+ **Подсказка появляется с задержкой 300 мс.** Она гасит мелькание при быстром проходе курсора по
23
+ ряду кнопок. Уход курсора до истечения задержки не показывает ничего.
24
+
25
+ ## Как этим пользоваться
26
+
27
+ - Показывают и наведение, и фокус с клавиатуры; прячут уход курсора, потеря фокуса и **клик**
28
+ (панель мешала бы смотреть на результат нажатия).
29
+ - `rt-icon-button` уже несёт эту директиву — там достаточно входа `tooltip`.
30
+ - Подсказка не заменяет `aria-label`: она вспомогательная, а имя контрола задаётся отдельно.
31
+
32
+ ## Рядом
33
+
34
+ - [`[rtPopover]`](../popover/CONTEXT.md) — когда в панель нужно положить разметку.
@@ -0,0 +1,20 @@
1
+ # `rt-welcome-dialog`
2
+
3
+ Приветственное окно с текстом и одной кнопкой. Открывается через
4
+ [`RtDialogService`](../dialog/CONTEXT.md).
5
+
6
+ ```typescript
7
+ this.#dialog.open<RtWelcomeDialogComponent, IRtWelcomeDialog.Data>(RtWelcomeDialogComponent, {
8
+ data: { message: 'Добро пожаловать\n\nЗдесь появятся ваши заявки.', ctaLabel: 'Поехали' },
9
+ });
10
+ ```
11
+
12
+ Данные приходят токеном `RT_DIALOG_DATA`: `message`, необязательный `ctaLabel`.
13
+
14
+ ## Главное, что нужно знать
15
+
16
+ **Заголовок компонент выбирает сам — это первый абзац сообщения.** Приветствие приходит одной
17
+ строкой из настроек приложения, и делить её на заголовок и текст приходится здесь: абзацы
18
+ разделяются пустой строкой, пустые отбрасываются.
19
+
20
+ Без данных окно рисуется пустым, но не падает — остаётся одна кнопка.
@@ -1,7 +1,11 @@
1
1
  /* Welcome-модалка первого входа — открывается через RtDialogService.open().
2
- rt-dialog даёт styled-frame, контент внутри получает свой padding. */
2
+ rt-dialog даёт styled-frame, контент внутри получает свой padding.
3
3
 
4
- :host {
4
+ ViewEncapsulation.None. Хост адресуется по имени элемента, а не по классу
5
+ блока: класс `.rt-welcome-dialog` висит и на `<rt-welcome-dialog>`, и на
6
+ обёртке содержимого внутри него, поэтому правила обёртки вложены в хост. */
7
+
8
+ rt-welcome-dialog {
5
9
  display: contents;
6
10
 
7
11
  .rt-welcome-dialog {
@@ -0,0 +1,46 @@
1
+ # `rt-workspace`
2
+
3
+ Трёхколоночный рабочий стол: список, карточка, панель подробностей. Колонки тянутся мышью и
4
+ клавиатурой, ширины запоминаются.
5
+
6
+ ```html
7
+ <rt-workspace storageKey="inbox" [hasActive]="!!active()" (backClicked)="clearActive()">
8
+ <ng-template rtWorkspaceList let-api><rt-thread-list … /></ng-template>
9
+ <ng-template rtWorkspaceCenter><app-card /></ng-template>
10
+ <ng-template rtWorkspaceAside><rt-workspace-details … /></ng-template>
11
+ </rt-workspace>
12
+ ```
13
+
14
+ | вход | тип | умолчание |
15
+ | ------------------------------------------------------- | ------------------ | --------------- |
16
+ | `storageKey` | `string \| null` | `null` |
17
+ | `hasActive` | `boolean` | `false` |
18
+ | `listMinWidth` / `listMaxWidth` / `listDefaultWidth` | `number \| string` | 240 / 480 / 320 |
19
+ | `asideMinWidth` / `asideMaxWidth` / `asideDefaultWidth` | `number \| string` | 280 / 560 / 360 |
20
+ | `centerMinWidth` | `number \| string` | 360 |
21
+
22
+ Выход: `backClicked`. API панели: `openAside()`, `closeAside()`, `toggleAside()`,
23
+ `toggleAsideCollapsed()`, сигналы `asideOpen()`, `asideCollapsed()`, `listWidth()`, `asideWidth()`.
24
+
25
+ ## Главное, что нужно знать
26
+
27
+ **Без `storageKey` ширины не запоминаются.** С ключом они переживают пересоздание компонента:
28
+ раскладку рабочего стола настраивают один раз, и сбрасывать её на каждом заходе было бы хуже.
29
+
30
+ **Ручки — полноценные разделители**: `role="separator"`, в таб-порядке, стрелки двигают их с
31
+ шагом 16px, двойной клик возвращает умолчание. Текущая ширина и границы объявлены через
32
+ `aria-valuenow/min/max`.
33
+
34
+ **Стрелки у правой ручки работают зеркально**: `ArrowLeft` расширяет панель подробностей, потому
35
+ что она растёт влево.
36
+
37
+ ## Края
38
+
39
+ - Ширина всегда зажимается в границы — и при перетаскивании, и с клавиатуры.
40
+ - На узком экране появляется полоса с кнопками «назад» и «подробности» (только при `hasActive`);
41
+ «назад» закрывает панель подробностей и поднимает событие.
42
+ - `asideCollapsed` — это «свернуть на широком экране», `asideOpen` — «показать на узком».
43
+
44
+ ## Рядом
45
+
46
+ - [`rt-workspace-details`](../workspace-details/CONTEXT.md) — типовое наполнение правой панели.
@@ -0,0 +1,42 @@
1
+ # `rt-workspace-details`
2
+
3
+ Типовое наполнение правой панели рабочего стола: перечень полей, суммы, переключатели, переход
4
+ по этапам, история и кнопки действий.
5
+
6
+ ```html
7
+ <rt-workspace-details
8
+ title="Заявка №12"
9
+ [rows]="rows()"
10
+ [money]="money()"
11
+ [toggles]="toggles()"
12
+ [transition]="transition()"
13
+ [audit]="audit()"
14
+ [actions]="actions()"
15
+ [loading]="loading()"
16
+ (toggleChange)="onToggle($event)"
17
+ (transitionSubmit)="moveStage($event)"
18
+ (auditLoadMore)="loadMoreAudit()"
19
+ (actionClicked)="runAction($event)" />
20
+ ```
21
+
22
+ Входы: `title`, `entityId`, `loading`, `busy`, `rows`, `agentEdit`, `money`, `toggles`,
23
+ `toggleHint`, `transition`, `audit`, `actions`, `error`.
24
+ Выходы: `toggleChange`, `agentReassign`, `transitionSubmit`, `transitionSuccessClose`,
25
+ `transitionErrorClose`, `auditLoadMore`, `actionClicked`.
26
+
27
+ ## Главное, что нужно знать
28
+
29
+ **Вкладки появляются только вместе с переходом или историей.** Пока есть одни поля, они рисуются
30
+ сразу: одна вкладка вместо содержимого была бы лишним щелчком.
31
+
32
+ **Ошибка не рисуется внутри панели — она уходит в [`NotificationBus`](../toast/CONTEXT.md).**
33
+ Панель узкая, и сообщение в ней сдвигало бы данные; тост показывает ошибку поверх. Одна и та же
34
+ строка не повторяется на каждой перерисовке.
35
+
36
+ ## Края
37
+
38
+ - `loading` подменяет заглушками значения полей и сумм, подписи остаются.
39
+ - Действие с `confirm` открывает [`[rtConfirm]`](../confirm-popover/CONTEXT.md), и
40
+ `actionClicked` приходит только после подтверждения.
41
+ - Смена исполнителя (`agentEdit`) — отдельный сценарий с выбором и подтверждением; событие
42
+ `agentReassign` отдаёт идентификатор нового исполнителя.
@@ -1,6 +1,11 @@
1
- /* Semantic design tokens — light defaults. */
1
+ /* Semantic design tokens — light defaults.
2
2
 
3
- :root {
3
+ Тело вынесено в @mixin по той же причине, что и у тёмной темы: набор нужен не
4
+ только на `:root`, но и на отдельном контейнере. Без этого светлую половину
5
+ пары «светлая ↔ тёмная» нельзя показать, пока приложение стоит в тёмной теме, —
6
+ контейнер унаследует тёмные значения, и обе половины покажут одно и то же. */
7
+
8
+ @mixin rt-theme-light-tokens {
4
9
  /* Background */
5
10
  --rt-color-bg-page: var(--rt-neutral-50);
6
11
  --rt-color-bg-surface: var(--rt-neutral-0);
@@ -287,6 +292,10 @@
287
292
  --rt-field-value-empty-color: var(--rt-color-text-muted);
288
293
  }
289
294
 
295
+ :root {
296
+ @include rt-theme-light-tokens;
297
+ }
298
+
290
299
  /* На тач-устройствах инпут не меньше 16px: WebKit (весь iOS, включая Chrome)
291
300
  зумит страницу при фокусе на поле с font-size < 16px — отсюда горизонтальный
292
301
  сдвиг вёрстки. Десктоп сохраняет плотный 14px. */
package/styles/tokens.css CHANGED
@@ -192,7 +192,12 @@
192
192
  --rt-bp-xl: 1380px;
193
193
  }
194
194
 
195
- /* Semantic design tokens — light defaults. */
195
+ /* Semantic design tokens — light defaults.
196
+
197
+ Тело вынесено в @mixin по той же причине, что и у тёмной темы: набор нужен не
198
+ только на `:root`, но и на отдельном контейнере. Без этого светлую половину
199
+ пары «светлая ↔ тёмная» нельзя показать, пока приложение стоит в тёмной теме, —
200
+ контейнер унаследует тёмные значения, и обе половины покажут одно и то же. */
196
201
  :root {
197
202
  /* Background */
198
203
  --rt-color-bg-page: var(--rt-neutral-50);
@@ -653,10 +658,16 @@ html.rt-theme-dark .rt-logo {
653
658
  --rt-btn-color: var(--rt-color-on-disabled, #6b7280);
654
659
  cursor: not-allowed;
655
660
  }
661
+ .rt-button {
662
+ /* `flex-shrink: 0` — иконке заданного размера. Без него в кнопке, которой ширину
663
+ навязали снаружи (пункт меню `rt-split-button` берёт её от панели), лейбл давит
664
+ на иконку, и та сжимается до нуля: место занято, а иконки не видно. */
665
+ }
656
666
  .rt-button__icon {
657
667
  display: inline-flex;
658
668
  width: var(--rt-btn-icon-size);
659
669
  height: var(--rt-btn-icon-size);
670
+ flex-shrink: 0;
660
671
  align-items: center;
661
672
  justify-content: center;
662
673
  font-size: var(--rt-btn-icon-size);
@@ -774,6 +785,20 @@ html.rt-theme-dark .rt-logo {
774
785
  --rt-btn-icon-size: 1.125rem;
775
786
  --rt-btn-spinner-size: 1.125rem;
776
787
  }
788
+ .rt-button--xl {
789
+ --rt-btn-height: 60px;
790
+ --rt-btn-padding: 0 1.75rem;
791
+ --rt-btn-font-size: 1.125rem;
792
+ --rt-btn-icon-size: 1.25rem;
793
+ --rt-btn-spinner-size: 1.25rem;
794
+ }
795
+ .rt-button--2xl {
796
+ --rt-btn-height: 70px;
797
+ --rt-btn-padding: 0 2rem;
798
+ --rt-btn-font-size: 1.1875rem;
799
+ --rt-btn-icon-size: 1.375rem;
800
+ --rt-btn-spinner-size: 1.375rem;
801
+ }
777
802
  .rt-button--icon-only {
778
803
  width: var(--rt-btn-height);
779
804
  padding: 0;