@rt-tools/ui-kit-v2 0.41.0 → 0.43.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 (56) hide show
  1. package/fesm2022/rt-tools-ui-kit-v2-calendar.mjs +4 -4
  2. package/fesm2022/rt-tools-ui-kit-v2-calendar.mjs.map +1 -1
  3. package/fesm2022/rt-tools-ui-kit-v2-core.mjs +22 -0
  4. package/fesm2022/rt-tools-ui-kit-v2-core.mjs.map +1 -1
  5. package/fesm2022/rt-tools-ui-kit-v2-date-picker.mjs +155 -100
  6. package/fesm2022/rt-tools-ui-kit-v2-date-picker.mjs.map +1 -1
  7. package/fesm2022/rt-tools-ui-kit-v2-date-range.mjs +2 -2
  8. package/fesm2022/rt-tools-ui-kit-v2-date-range.mjs.map +1 -1
  9. package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs +1778 -18
  10. package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs.map +1 -1
  11. package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs +22 -5
  12. package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs.map +1 -1
  13. package/fesm2022/rt-tools-ui-kit-v2-stepper.mjs +34 -11
  14. package/fesm2022/rt-tools-ui-kit-v2-stepper.mjs.map +1 -1
  15. package/fesm2022/rt-tools-ui-kit-v2-tabs.mjs +725 -47
  16. package/fesm2022/rt-tools-ui-kit-v2-tabs.mjs.map +1 -1
  17. package/fesm2022/rt-tools-ui-kit-v2-workspace-details.mjs +6 -0
  18. package/fesm2022/rt-tools-ui-kit-v2-workspace-details.mjs.map +1 -1
  19. package/fesm2022/rt-tools-ui-kit-v2-workspace.mjs +217 -6
  20. package/fesm2022/rt-tools-ui-kit-v2-workspace.mjs.map +1 -1
  21. package/package.json +1 -1
  22. package/src/lib/components/calendar/CONTEXT.md +4 -2
  23. package/src/lib/components/calendar/rt-calendar.component.scss +29 -2
  24. package/src/lib/components/date-picker/CONTEXT.md +5 -0
  25. package/src/lib/components/date-picker/panel/CONTEXT.md +42 -0
  26. package/src/lib/components/date-picker/panel/rt-date-panel.component.scss +55 -2
  27. package/src/lib/components/page-header/CONTEXT.md +35 -1
  28. package/src/lib/components/page-header/bar/rt-page-bar.component.scss +161 -0
  29. package/src/lib/components/page-header/rail/rt-page-actions.component.scss +115 -0
  30. package/src/lib/components/page-header/rail/rt-page-phone-menu.component.scss +129 -0
  31. package/src/lib/components/page-header/rail/rt-page-rail.component.scss +281 -0
  32. package/src/lib/components/page-header/rail/rt-page-user.component.scss +76 -0
  33. package/src/lib/components/page-header/rt-page-header.component.scss +5 -0
  34. package/src/lib/components/page-header/stories/component/test-page-header-vertical.component.scss +72 -0
  35. package/src/lib/components/page-header/stories/component/test-page-table.component.scss +81 -0
  36. package/src/lib/components/page-header/user/rt-page-header-user.component.scss +6 -0
  37. package/src/lib/components/stepper/CONTEXT.md +34 -2
  38. package/src/lib/components/stepper/rt-stepper.component.scss +62 -43
  39. package/src/lib/components/tabs/CONTEXT.md +30 -1
  40. package/src/lib/components/tabs/rt-tabs-arrows.scss +140 -0
  41. package/src/lib/components/tabs/rt-tabs-more-menu.scss +126 -0
  42. package/src/lib/components/tabs/rt-tabs-more.component.scss +29 -0
  43. package/src/lib/components/tabs/rt-tabs.component.scss +18 -61
  44. package/src/lib/components/workspace/CONTEXT.md +11 -1
  45. package/src/lib/components/workspace/rt-workspace.component.scss +51 -3
  46. package/src/rich-editor/lib/components/chat/CONTEXT.md +12 -2
  47. package/src/rich-editor/lib/components/chat/rt-chat-messenger.scss +9 -3
  48. package/src/rich-editor/lib/components/chat/rt-chat-translation.scss +92 -0
  49. package/types/rt-tools-ui-kit-v2-calendar.d.ts +13 -1
  50. package/types/rt-tools-ui-kit-v2-core.d.ts +9 -1
  51. package/types/rt-tools-ui-kit-v2-date-picker.d.ts +157 -5
  52. package/types/rt-tools-ui-kit-v2-page-header.d.ts +202 -2
  53. package/types/rt-tools-ui-kit-v2-rich-editor.d.ts +25 -0
  54. package/types/rt-tools-ui-kit-v2-stepper.d.ts +20 -6
  55. package/types/rt-tools-ui-kit-v2-tabs.d.ts +120 -1
  56. package/types/rt-tools-ui-kit-v2-workspace.d.ts +33 -1
@@ -0,0 +1,126 @@
1
+ @layer rt-kit.components {
2
+ /* Панель рисуется в CDK Overlay, вне блока вкладок: свойства объявлены на ней самой. */
3
+ .rt-tabs-more-menu {
4
+ --rt-tabs-more-menu-radius: var(--rt-overlay-menu-radius);
5
+ --rt-tabs-more-menu-border-width: var(--rt-border-width-thin);
6
+ --rt-tabs-more-menu-shadow: var(--rt-overlay-menu-shadow);
7
+ --rt-tabs-more-menu-row-radius: var(--rt-radius-sm);
8
+ --rt-tabs-more-menu-close-radius: var(--rt-radius-full);
9
+ --rt-tabs-more-menu-max-height: 282px;
10
+
11
+ display: flex;
12
+ overflow: hidden auto;
13
+ width: var(--rt-size-60);
14
+ max-height: var(--rt-tabs-more-menu-max-height);
15
+ box-sizing: border-box;
16
+ flex-direction: column;
17
+ padding: var(--rt-overlay-menu-padding-y) var(--rt-space-xs);
18
+ border: var(--rt-tabs-more-menu-border-width) solid var(--rt-color-border-subtle);
19
+ border-radius: var(--rt-tabs-more-menu-radius);
20
+ background: var(--rt-overlay-menu-bg);
21
+ box-shadow: var(--rt-tabs-more-menu-shadow);
22
+
23
+ &__row {
24
+ display: flex;
25
+ min-height: var(--rt-overlay-menu-item-min-height);
26
+ flex: none;
27
+ align-items: center;
28
+ border-radius: var(--rt-tabs-more-menu-row-radius);
29
+ padding-inline-end: var(--rt-space-2);
30
+
31
+ &:hover:not(.rt-tabs-more-menu__row--disabled) {
32
+ background: var(--rt-color-bg-hover);
33
+ }
34
+
35
+ &--disabled {
36
+ opacity: var(--rt-opacity-disabled);
37
+ }
38
+
39
+ &--invalid {
40
+ color: var(--rt-color-state-danger);
41
+ }
42
+ }
43
+
44
+ &__pick {
45
+ display: flex;
46
+ min-width: 0;
47
+ flex: 1 1 auto;
48
+ align-items: center;
49
+ padding: var(--rt-overlay-menu-item-padding-y) var(--rt-overlay-menu-item-padding-x);
50
+ border: 0;
51
+ background: none;
52
+ color: var(--rt-color-text-primary);
53
+ cursor: pointer;
54
+ font-family: inherit;
55
+ font-size: var(--rt-text-sm);
56
+ font-weight: var(--rt-overlay-menu-item-weight);
57
+ gap: var(--rt-space-sm);
58
+ outline: none;
59
+ text-align: start;
60
+
61
+ &:focus-visible {
62
+ background: var(--rt-color-bg-hover);
63
+ }
64
+
65
+ &[aria-disabled='true'] {
66
+ cursor: default;
67
+ }
68
+
69
+ .rt-tabs-more-menu__row--invalid & {
70
+ color: inherit;
71
+ }
72
+ }
73
+
74
+ &__icon {
75
+ flex: none;
76
+ }
77
+
78
+ &__label {
79
+ overflow: hidden;
80
+ min-width: 0;
81
+ flex: 1 1 auto;
82
+ text-overflow: ellipsis;
83
+ white-space: nowrap;
84
+ }
85
+
86
+ &__badge {
87
+ flex: none;
88
+ color: var(--rt-color-text-muted);
89
+ }
90
+
91
+ &__close {
92
+ display: inline-flex;
93
+ width: var(--rt-size-5);
94
+ height: var(--rt-size-5);
95
+ flex: none;
96
+ align-items: center;
97
+ justify-content: center;
98
+ padding: 0;
99
+ border: 0;
100
+ border-radius: var(--rt-tabs-more-menu-close-radius);
101
+ background: transparent;
102
+ color: var(--rt-color-text-muted);
103
+ cursor: pointer;
104
+
105
+ /* Крестик виден у строки под указателем и у строки с фокусом клавиатуры. Прячется
106
+ прозрачностью, а не display: строка не меняет ширину, кнопка остаётся в обходе Tab. */
107
+ opacity: 0;
108
+
109
+ .rt-tabs-more-menu__row:hover &,
110
+ .rt-tabs-more-menu__row:focus-within & {
111
+ opacity: 1;
112
+ }
113
+
114
+ /* Без наведения — на касании — крестик виден всегда: невидимая кнопка закрыла бы
115
+ вкладку там, где человек хотел её выбрать. */
116
+ @media (hover: none) {
117
+ opacity: 1;
118
+ }
119
+
120
+ &:hover {
121
+ background: var(--rt-color-bg-hover);
122
+ color: var(--rt-color-text-primary);
123
+ }
124
+ }
125
+ }
126
+ }
@@ -0,0 +1,29 @@
1
+ @layer rt-kit.components {
2
+ /* Пункт стоит в ряду последним; пустой остаётся в разметке, чтобы ряд знал его ширину заранее. */
3
+ .rt-tabs-more {
4
+ --rt-tabs-more-dot-radius: var(--rt-radius-full);
5
+
6
+ display: inline-flex;
7
+ order: 9999;
8
+
9
+ &--idle {
10
+ position: absolute;
11
+ top: 0;
12
+ left: 0;
13
+ pointer-events: none;
14
+ visibility: hidden;
15
+ }
16
+
17
+ .rt-tab-item__trigger--open {
18
+ background-color: var(--rt-color-bg-hover);
19
+ color: var(--rt-color-text-primary);
20
+ }
21
+
22
+ .rt-tab-item__more-dot {
23
+ width: var(--rt-size-2);
24
+ height: var(--rt-size-2);
25
+ border-radius: var(--rt-tabs-more-dot-radius);
26
+ background-color: var(--rt-color-state-danger);
27
+ }
28
+ }
29
+ }
@@ -74,6 +74,11 @@
74
74
  justify-content: space-between;
75
75
  }
76
76
 
77
+ /* Режим «Ещё»: полоса не прокручивается, лишние вкладки стоят в меню. */
78
+ &--more {
79
+ overflow-x: clip;
80
+ }
81
+
77
82
  /* Полосу рисует общий элемент, и своя полоса выбранной вкладки гаснет. У неверной
78
83
  вкладки своя полоса остаётся: она красная и у невыбранной. */
79
84
  &--ink .rt-tab-item--selected:not(.rt-tab-item--invalid):after {
@@ -110,67 +115,6 @@
110
115
  }
111
116
  }
112
117
 
113
- &__rest {
114
- position: absolute;
115
- z-index: 1;
116
- top: 0;
117
- bottom: 0;
118
- display: flex;
119
- width: var(--rt-control-height-lg);
120
- align-items: center;
121
- justify-content: center;
122
- background-color: var(--rt-color-bg-surface);
123
- color: var(--rt-color-text-muted);
124
- cursor: pointer;
125
- transition: color var(--rt-tabs-transition-duration) linear;
126
- visibility: hidden;
127
-
128
- &:hover {
129
- color: var(--rt-color-text-primary);
130
- }
131
-
132
- &--before {
133
- left: 0;
134
- border-right: var(--rt-tabs-border-width) solid var(--rt-color-border-default);
135
- }
136
-
137
- &--after {
138
- right: 0;
139
- border-left: var(--rt-tabs-border-width) solid var(--rt-color-border-default);
140
- }
141
-
142
- &--visible {
143
- visibility: visible;
144
- }
145
- }
146
-
147
- /* Стрелки в своих местах: при переполнении обе стоят по краям, полоса между ними уже.
148
- Стрелка в сторону, куда прокручивать некуда, бледнеет и не нажимается. Черта снизу
149
- продолжает черту полосы под стрелками. */
150
- &__tab-list-wrapper--inline {
151
- align-items: stretch;
152
-
153
- .rt-tabs__rest {
154
- position: static;
155
- display: none;
156
- flex-shrink: 0;
157
- border: 0;
158
- border-bottom: var(--rt-tabs-border-width) solid var(--rt-color-border-default);
159
- background-color: transparent;
160
- }
161
-
162
- &.rt-tabs__tab-list-wrapper--overflowing .rt-tabs__rest {
163
- display: flex;
164
- visibility: visible;
165
- }
166
-
167
- .rt-tabs__rest--inactive {
168
- color: var(--rt-color-text-disabled);
169
- cursor: default;
170
- pointer-events: none;
171
- }
172
- }
173
-
174
118
  &__controls {
175
119
  display: flex;
176
120
  flex-shrink: 0;
@@ -299,6 +243,14 @@
299
243
  translate: 0 var(--rt-tab-item-border-width);
300
244
  }
301
245
 
246
+ /* Вкладка меню остаётся в разметке ради замера: ряд читает её ширину при каждом пересчёте. */
247
+ &--in-more {
248
+ position: absolute;
249
+ top: 0;
250
+ left: 0;
251
+ visibility: hidden;
252
+ }
253
+
302
254
  &:hover:not(.rt-tab-item--disabled, .rt-tab-item--selected) {
303
255
  background-color: var(--rt-color-bg-hover);
304
256
  color: var(--rt-color-text-primary);
@@ -466,5 +418,10 @@
466
418
  max-width: 100%;
467
419
  flex: 1 1 auto;
468
420
  }
421
+
422
+ /* Замер ряда «Ещё» берёт ширину по содержимому: растянутая заполнила бы ряд целиком. */
423
+ .rt-tabs__tab-list--measure > &--stretch {
424
+ flex-grow: 0;
425
+ }
469
426
  }
470
427
  }
@@ -18,9 +18,12 @@
18
18
  | `listMinWidth` / `listMaxWidth` / `listDefaultWidth` | `number \| string` | 240 / 480 / 320 |
19
19
  | `asideMinWidth` / `asideMaxWidth` / `asideDefaultWidth` | `number \| string` | 280 / 560 / 360 |
20
20
  | `centerMinWidth` | `number \| string` | 360 |
21
+ | `singleColumnBreakpoint` | `number \| null` | `null` |
22
+ | `asideOverlayWidth` | `number \| string` | 540 |
21
23
 
22
24
  Выход: `backClicked`. API панели: `openAside()`, `closeAside()`, `toggleAside()`,
23
- `toggleAsideCollapsed()`, сигналы `asideOpen()`, `asideCollapsed()`, `listWidth()`, `asideWidth()`.
25
+ `toggleAsideCollapsed()`, сигналы `asideOpen()`, `asideCollapsed()`, `asideOverlay()`, `listWidth()`,
26
+ `asideWidth()`.
24
27
 
25
28
  ## Главное, что нужно знать
26
29
 
@@ -34,6 +37,13 @@
34
37
  **Стрелки у правой ручки работают зеркально**: `ArrowLeft` расширяет панель подробностей, потому
35
38
  что она растёт влево.
36
39
 
40
+ **Порог одной колонки задаёт `singleColumnBreakpoint`.** Без входа порог держат стили: 768. С
41
+ входом одна колонка остаётся только на месте не шире него. Выше порога список и середина стоят
42
+ рядом. Пока место не шире 1080, панель подробностей открывается поверх окна: боковая панель шириной
43
+ `asideOverlayWidth` с затемнением и кнопкой «Закрыть». Её закрывают кнопка, затемнение и Esc, после
44
+ этого `asideOpen()` возвращает `false`. Сигнал `asideOverlay()` говорит, что панель сейчас
45
+ открывается так. Порог выше 1080 не задают: третья колонка появляется на 1080.
46
+
37
47
  ## Края
38
48
 
39
49
  - Ширина всегда зажимается в границы — и при перетаскивании, и с клавиатуры.
@@ -123,12 +123,19 @@
123
123
  }
124
124
  }
125
125
 
126
+ // Порог одной колонки по умолчанию. С порогом из входа вид считает компонент: класс
127
+ // `--breakpoint` снимает эти правила, а класс `--single` ниже ставит те же по своему числу
126
128
  @include bp.place-max(768px) {
127
- &__list {
129
+ &:not(.rt-workspace--breakpoint) .rt-workspace__list {
128
130
  flex-basis: 100%;
129
131
  }
130
132
  }
131
133
 
134
+ // Панель сведений открыта поверх окна боковой панелью: своей колонки и места она не держит
135
+ &__aside--overlay {
136
+ display: none;
137
+ }
138
+
132
139
  @include bp.place-min(1080px) {
133
140
  &__aside {
134
141
  overflow: hidden;
@@ -140,7 +147,25 @@
140
147
  }
141
148
  }
142
149
 
143
- &--has-active {
150
+ &--single {
151
+ .rt-workspace__list {
152
+ flex-basis: 100%;
153
+ }
154
+
155
+ &.rt-workspace--has-active .rt-workspace__list {
156
+ display: none;
157
+ }
158
+
159
+ &.rt-workspace--has-active .rt-workspace__center {
160
+ flex-basis: 100%;
161
+ }
162
+
163
+ &.rt-workspace--cards {
164
+ gap: 0;
165
+ }
166
+ }
167
+
168
+ &--has-active:not(.rt-workspace--breakpoint) {
144
169
  @include bp.place-max(768px) {
145
170
  .rt-workspace__list {
146
171
  display: none;
@@ -204,7 +229,9 @@
204
229
  }
205
230
 
206
231
  @include bp.place-max(768px) {
207
- gap: 0;
232
+ &:not(.rt-workspace--breakpoint) {
233
+ gap: 0;
234
+ }
208
235
  }
209
236
  }
210
237
 
@@ -224,4 +251,25 @@
224
251
  }
225
252
  }
226
253
  }
254
+
255
+ // Обёртка панели поверх окна боксом не становится: рамка `rt-aside` остаётся ребёнком панели
256
+ // оверлея. Поля содержимого сняты: шаблон панели сведений писан под колонку без полей
257
+ .rt-workspace-aside-overlay {
258
+ display: contents;
259
+
260
+ .rt-aside__content {
261
+ display: flex;
262
+ flex-direction: column;
263
+ padding: 0;
264
+ }
265
+ }
266
+
267
+ // Панель сведений поверх окна держит свою ширину и на узком окне. Общая панель там занимает
268
+ // окно целиком, и затемнение под ней было бы негде нажать
269
+ @media (width <= 768px) {
270
+ .rt-aside-overlay.rt-workspace-aside-pane {
271
+ width: auto;
272
+ max-width: 100dvw;
273
+ }
274
+ }
227
275
  }
@@ -48,12 +48,21 @@ rtChatMessageActions let-message>` рисуется в меню «…» у ре
48
48
  ставит курсор в конец. Файлы остаются, сигнала набора нет, закрытое поле текст не принимает.
49
49
  Работу метода показывает история `QuickReplies` страницы переписки: кнопка у поля ответа и
50
50
  подсказка в боковой панели ставят текст в поле, гостю ничего не уходит. Метод `draftText` читает
51
- текст поля без разметки и файлы не трогает.
51
+ текст поля без разметки и файлы не трогает, а метод `draftFiles` отдаёт выбранные файлы.
52
52
 
53
53
  **Подпись на пузыре даёт приложение.** `dateLabel` стоит вместо времени, `dateIcon` на месте значка
54
54
  статуса. Значки ошибки отправки и недоставки остаются: они предупреждают. Подписи дней считаются от
55
55
  `createdAt`.
56
56
 
57
+ **Перевод реплики показывает приложение, чат даёт место.** `translationLabel` стоит в строке времени
58
+ перед временем: «Переведено · 12:58». `canShowTranslation` ставит под текстом кнопку «Показать
59
+ перевод», нажатие уходит выходом `showTranslation`. Текст реплики чат не меняет. Пункт «Показать
60
+ оригинал» приложение кладёт в меню реплики через `rtChatMessageActions`.
61
+
62
+ **Загрузку и ошибку перевода тоже задаёт приложение.** `translationLoading` ставит перед кнопкой
63
+ спиннер, кнопка приглушена и не нажимается. `translationError` выводит текст ошибки строкой над
64
+ кнопкой, кнопка повторяет запрос. Оба поля работают только вместе с `canShowTranslation`.
65
+
57
66
  **Пузырь мессенджера не шире 85% ленты и не шире 320.** Предел стоит на пузыре, а не на строке:
58
67
  кнопки у реплики лежат рядом и не отнимают его ширину. Значок статуса 16, подпись и значок на своём
59
68
  пузыре без прозрачности, пузырь гостя белый с тенью. Боковой отступ чата 16, на узком месте 12.
@@ -62,7 +71,8 @@ rtChatMessageActions let-message>` рисуется в меню «…» у ре
62
71
  занимает, а без поля слота нет.
63
72
 
64
73
  **Удалённое сообщение остаётся в ленте** отдельной пометкой вместо текста: иначе непонятно, на
65
- что отвечали соседние реплики.
74
+ что отвечали соседние реплики. Пузырь у него без заливки и без тени, поэтому в виде мессенджера
75
+ своё удалённое сообщение не берёт белый цвет своей реплики: пометка, время и знак статуса приглушённые.
66
76
 
67
77
  ## Края
68
78
 
@@ -130,12 +130,18 @@
130
130
  line-height: round(1em * var(--rt-leading-snug), 1px);
131
131
  }
132
132
 
133
- .rt-chat__message--own .rt-chat__message-text,
134
- .rt-chat__message--own .rt-chat__message-date,
135
- .rt-chat__message--own .rt-chat__message-status {
133
+ // Снятая реплика стоит без заливки: белый цвет заливки ей не даётся, тени под пустым
134
+ // пузырём тоже нет
135
+ .rt-chat__message--own:not(.rt-chat__message--deleted) .rt-chat__message-text,
136
+ .rt-chat__message--own:not(.rt-chat__message--deleted) .rt-chat__message-date,
137
+ .rt-chat__message--own:not(.rt-chat__message--deleted) .rt-chat__message-status {
136
138
  color: var(--rt-color-action-on-primary);
137
139
  }
138
140
 
141
+ .rt-chat__message--deleted {
142
+ box-shadow: none;
143
+ }
144
+
139
145
  .rt-chat__message-footer {
140
146
  justify-content: flex-end;
141
147
  }
@@ -0,0 +1,92 @@
1
+ // Перевод реплики: кнопка «Показать перевод» под текстом, её загрузка и строка ошибки. Подпись
2
+ // перевода стоит в строке времени и своих правил не имеет. Лежит отдельно от стилей чата, чтобы
3
+ // файлы уместились в предел длины.
4
+ @layer rt-kit.components {
5
+ .rt-chat {
6
+ --rt-chat-translate-outline-width: var(--rt-border-width-medium);
7
+ --rt-chat-translate-radius: var(--rt-radius-xs);
8
+ --rt-chat-translate-gap: var(--rt-space-2);
9
+
10
+ // Кнопка и строка ошибки прижаты к тексту и друг к другу: зазор пузыря между ними снят, как
11
+ // у строк одного абзаца
12
+ &__message-translate,
13
+ &__message-translate-error {
14
+ align-self: flex-start;
15
+ font-size: var(--rt-text-xs);
16
+ line-height: round(1em * var(--rt-leading-snug), 1px);
17
+ margin-block-start: calc(-1 * var(--rt-chat-translate-gap));
18
+ text-align: start;
19
+ }
20
+
21
+ &__message-translate-error {
22
+ color: var(--rt-color-state-error-text);
23
+
24
+ // Ошибки нет: пустой узел не держит строку и зазор пузыря
25
+ &:empty {
26
+ display: none;
27
+ }
28
+ }
29
+
30
+ &__message-translate {
31
+ display: inline-flex;
32
+ align-items: center;
33
+ padding: 0;
34
+ border: 0;
35
+ border-radius: var(--rt-chat-translate-radius);
36
+ background: transparent;
37
+ color: var(--rt-color-action-primary);
38
+ cursor: pointer;
39
+ font-family: inherit;
40
+ font-weight: var(--rt-font-weight-medium);
41
+ gap: var(--rt-space-1);
42
+
43
+ &:hover {
44
+ text-decoration: underline;
45
+ }
46
+
47
+ &:focus-visible {
48
+ outline: var(--rt-chat-translate-outline-width) solid var(--rt-color-border-focus);
49
+ }
50
+
51
+ // Перевод загружается: кнопка приглушена и не нажимается
52
+ &--loading,
53
+ &--loading:hover {
54
+ color: var(--rt-chat-bubble-date);
55
+ cursor: default;
56
+ text-decoration: none;
57
+ }
58
+ }
59
+
60
+ // Спиннер виден только при загрузке. Селектор из двух классов: правило самого спиннера
61
+ // ставит ему показ тем же весом
62
+ &__message-translate &__message-translate-spinner {
63
+ display: none;
64
+ }
65
+
66
+ &__message-translate--loading &__message-translate-spinner {
67
+ display: inline-flex;
68
+ }
69
+
70
+ &--messenger {
71
+ --rt-chat-translate-gap: var(--rt-space-0-5);
72
+
73
+ // На заливке цвета действия синяя кнопка и красная ошибка не читаются: они белые
74
+ .rt-chat__message--own .rt-chat__message-translate-error {
75
+ color: var(--rt-color-action-on-primary);
76
+ }
77
+
78
+ .rt-chat__message--own .rt-chat__message-translate {
79
+ color: var(--rt-color-action-on-primary);
80
+ text-decoration: underline;
81
+
82
+ &:focus-visible {
83
+ outline-color: var(--rt-color-action-on-primary);
84
+ }
85
+ }
86
+
87
+ .rt-chat__message--own .rt-chat__message-translate--loading {
88
+ text-decoration: none;
89
+ }
90
+ }
91
+ }
92
+ }
@@ -38,12 +38,24 @@ export declare namespace IRtCalendar {
38
38
  key: string;
39
39
  day: Day;
40
40
  }
41
- /** View-модель месяца: подпись, пустые ячейки до первого дня, дни. */
41
+ /** День соседнего месяца в начале или в конце сетки: бледный, не нажимается. */
42
+ interface OutsideDay {
43
+ key: string;
44
+ dayOfMonth: number;
45
+ /** День за границей выбора — ещё и зачёркнут. */
46
+ crossed: boolean;
47
+ }
48
+ /**
49
+ * View-модель месяца: подпись, пустые ячейки до первого дня, дни. Дни соседних месяцев
50
+ * необязательны: заданы — встают на место пустых ячеек и дописывают последнюю неделю.
51
+ */
42
52
  interface Month {
43
53
  key: string;
44
54
  label: string;
45
55
  leadingBlanks: readonly number[];
46
56
  days: readonly Day[];
57
+ leadingDays?: readonly OutsideDay[];
58
+ trailingDays?: readonly OutsideDay[];
47
59
  }
48
60
  }
49
61
  export declare class RtCalendarComponent {