@rt-tools/ui-kit-v2 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.
Files changed (144) hide show
  1. package/README.md +3 -2
  2. package/fesm2022/rt-tools-ui-kit-v2-accordion.mjs +1 -1
  3. package/fesm2022/rt-tools-ui-kit-v2-accordion.mjs.map +1 -1
  4. package/fesm2022/rt-tools-ui-kit-v2-action-bar.mjs +14 -8
  5. package/fesm2022/rt-tools-ui-kit-v2-action-bar.mjs.map +1 -1
  6. package/fesm2022/rt-tools-ui-kit-v2-ai-run-status.mjs +97 -0
  7. package/fesm2022/rt-tools-ui-kit-v2-ai-run-status.mjs.map +1 -0
  8. package/fesm2022/rt-tools-ui-kit-v2-aside.mjs +10 -3
  9. package/fesm2022/rt-tools-ui-kit-v2-aside.mjs.map +1 -1
  10. package/fesm2022/rt-tools-ui-kit-v2-autocomplete.mjs +1 -1
  11. package/fesm2022/rt-tools-ui-kit-v2-autocomplete.mjs.map +1 -1
  12. package/fesm2022/rt-tools-ui-kit-v2-bar-list.mjs +1 -1
  13. package/fesm2022/rt-tools-ui-kit-v2-bar-list.mjs.map +1 -1
  14. package/fesm2022/rt-tools-ui-kit-v2-checkbox.mjs +1 -1
  15. package/fesm2022/rt-tools-ui-kit-v2-checkbox.mjs.map +1 -1
  16. package/fesm2022/rt-tools-ui-kit-v2-copy-value.mjs +81 -0
  17. package/fesm2022/rt-tools-ui-kit-v2-copy-value.mjs.map +1 -0
  18. package/fesm2022/rt-tools-ui-kit-v2-core.mjs +99 -1
  19. package/fesm2022/rt-tools-ui-kit-v2-core.mjs.map +1 -1
  20. package/fesm2022/rt-tools-ui-kit-v2-data-list.mjs +5 -5
  21. package/fesm2022/rt-tools-ui-kit-v2-data-list.mjs.map +1 -1
  22. package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs +16 -4
  23. package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs.map +1 -1
  24. package/fesm2022/rt-tools-ui-kit-v2-download-link.mjs +1 -1
  25. package/fesm2022/rt-tools-ui-kit-v2-download-link.mjs.map +1 -1
  26. package/fesm2022/rt-tools-ui-kit-v2-dynamic-selector.mjs +124 -25
  27. package/fesm2022/rt-tools-ui-kit-v2-dynamic-selector.mjs.map +1 -1
  28. package/fesm2022/rt-tools-ui-kit-v2-empty-state.mjs +3 -3
  29. package/fesm2022/rt-tools-ui-kit-v2-empty-state.mjs.map +1 -1
  30. package/fesm2022/rt-tools-ui-kit-v2-expansion-panel.mjs +1 -1
  31. package/fesm2022/rt-tools-ui-kit-v2-expansion-panel.mjs.map +1 -1
  32. package/fesm2022/rt-tools-ui-kit-v2-field.mjs +1 -1
  33. package/fesm2022/rt-tools-ui-kit-v2-field.mjs.map +1 -1
  34. package/fesm2022/rt-tools-ui-kit-v2-file-card.mjs +1 -1
  35. package/fesm2022/rt-tools-ui-kit-v2-file-card.mjs.map +1 -1
  36. package/fesm2022/rt-tools-ui-kit-v2-icon-button.mjs +1 -1
  37. package/fesm2022/rt-tools-ui-kit-v2-icon-button.mjs.map +1 -1
  38. package/fesm2022/rt-tools-ui-kit-v2-icon.mjs +64 -27
  39. package/fesm2022/rt-tools-ui-kit-v2-icon.mjs.map +1 -1
  40. package/fesm2022/rt-tools-ui-kit-v2-input-number.mjs +1 -1
  41. package/fesm2022/rt-tools-ui-kit-v2-input-number.mjs.map +1 -1
  42. package/fesm2022/rt-tools-ui-kit-v2-input.mjs +1 -1
  43. package/fesm2022/rt-tools-ui-kit-v2-input.mjs.map +1 -1
  44. package/fesm2022/rt-tools-ui-kit-v2-menu.mjs +1 -1
  45. package/fesm2022/rt-tools-ui-kit-v2-menu.mjs.map +1 -1
  46. package/fesm2022/rt-tools-ui-kit-v2-message.mjs +1 -1
  47. package/fesm2022/rt-tools-ui-kit-v2-message.mjs.map +1 -1
  48. package/fesm2022/rt-tools-ui-kit-v2-multiselect.mjs +1 -1
  49. package/fesm2022/rt-tools-ui-kit-v2-multiselect.mjs.map +1 -1
  50. package/fesm2022/rt-tools-ui-kit-v2-notifications-bell.mjs +1 -1
  51. package/fesm2022/rt-tools-ui-kit-v2-notifications-bell.mjs.map +1 -1
  52. package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs +1 -1
  53. package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs.map +1 -1
  54. package/fesm2022/rt-tools-ui-kit-v2-prompt-suggestion.mjs +46 -0
  55. package/fesm2022/rt-tools-ui-kit-v2-prompt-suggestion.mjs.map +1 -0
  56. package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs +336 -12
  57. package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs.map +1 -1
  58. package/fesm2022/rt-tools-ui-kit-v2-scroll-area.mjs +1 -1
  59. package/fesm2022/rt-tools-ui-kit-v2-scroll-area.mjs.map +1 -1
  60. package/fesm2022/rt-tools-ui-kit-v2-section-nav.mjs +1 -1
  61. package/fesm2022/rt-tools-ui-kit-v2-section-nav.mjs.map +1 -1
  62. package/fesm2022/rt-tools-ui-kit-v2-select.mjs +16 -2
  63. package/fesm2022/rt-tools-ui-kit-v2-select.mjs.map +1 -1
  64. package/fesm2022/rt-tools-ui-kit-v2-side-menu.mjs +3 -3
  65. package/fesm2022/rt-tools-ui-kit-v2-side-menu.mjs.map +1 -1
  66. package/fesm2022/rt-tools-ui-kit-v2-stat-tile.mjs +1 -1
  67. package/fesm2022/rt-tools-ui-kit-v2-stat-tile.mjs.map +1 -1
  68. package/fesm2022/rt-tools-ui-kit-v2-table.mjs +2 -2
  69. package/fesm2022/rt-tools-ui-kit-v2-table.mjs.map +1 -1
  70. package/fesm2022/rt-tools-ui-kit-v2-tabs.mjs +1 -1
  71. package/fesm2022/rt-tools-ui-kit-v2-tabs.mjs.map +1 -1
  72. package/fesm2022/rt-tools-ui-kit-v2-tag.mjs +1 -1
  73. package/fesm2022/rt-tools-ui-kit-v2-tag.mjs.map +1 -1
  74. package/fesm2022/rt-tools-ui-kit-v2-thread-list.mjs +31 -5
  75. package/fesm2022/rt-tools-ui-kit-v2-thread-list.mjs.map +1 -1
  76. package/fesm2022/rt-tools-ui-kit-v2-toast.mjs +1 -1
  77. package/fesm2022/rt-tools-ui-kit-v2-toast.mjs.map +1 -1
  78. package/fesm2022/rt-tools-ui-kit-v2-toggle-button-group.mjs +1 -1
  79. package/fesm2022/rt-tools-ui-kit-v2-toggle-button-group.mjs.map +1 -1
  80. package/fesm2022/rt-tools-ui-kit-v2-toggle-switch.mjs +1 -1
  81. package/fesm2022/rt-tools-ui-kit-v2-toggle-switch.mjs.map +1 -1
  82. package/fesm2022/rt-tools-ui-kit-v2-toolbar.mjs +2 -2
  83. package/fesm2022/rt-tools-ui-kit-v2-toolbar.mjs.map +1 -1
  84. package/fesm2022/rt-tools-ui-kit-v2.mjs +3 -0
  85. package/fesm2022/rt-tools-ui-kit-v2.mjs.map +1 -1
  86. package/package.json +13 -1
  87. package/rt-tools-ui-kit-v2-0.19.1.tgz +0 -0
  88. package/src/assets/icons/sparkle.svg +9 -0
  89. package/src/assets/icons/thumb-down.svg +10 -0
  90. package/src/assets/icons/thumb-up.svg +9 -0
  91. package/src/assets/icons/trash-x.svg +7 -0
  92. package/src/assets/icons-material/sparkle.fill.svg +5 -0
  93. package/src/assets/icons-material/sparkle.svg +5 -0
  94. package/src/assets/icons-material/thumb-down.fill.svg +5 -0
  95. package/src/assets/icons-material/thumb-down.svg +5 -0
  96. package/src/assets/icons-material/thumb-up.fill.svg +5 -0
  97. package/src/assets/icons-material/thumb-up.svg +5 -0
  98. package/src/assets/icons-material/trash-x.fill.svg +5 -0
  99. package/src/assets/icons-material/trash-x.svg +5 -0
  100. package/src/lib/components/action-bar/CONTEXT.md +8 -2
  101. package/src/lib/components/action-bar/rt-action-bar-holder.component.scss +10 -7
  102. package/src/lib/components/action-bar/rt-action-bar.component.scss +82 -34
  103. package/src/lib/components/ai-run-status/CONTEXT.md +41 -0
  104. package/src/lib/components/ai-run-status/rt-ai-run-status.component.scss +158 -0
  105. package/src/lib/components/aside/CONTEXT.md +1 -0
  106. package/src/lib/components/aside/header/rt-aside-header.component.scss +27 -11
  107. package/src/lib/components/copy-value/CONTEXT.md +31 -0
  108. package/src/lib/components/copy-value/rt-copy-value.component.scss +39 -0
  109. package/src/lib/components/data-list/settings/rt-data-list-settings-aside.component.scss +5 -5
  110. package/src/lib/components/data-table/CONTEXT.md +5 -0
  111. package/src/lib/components/dynamic-selector/CONTEXT.md +18 -0
  112. package/src/lib/components/dynamic-selector/list/rt-dynamic-selector-list.component.scss +29 -1
  113. package/src/lib/components/dynamic-selector/popup/rt-dynamic-selector-popup.component.scss +84 -25
  114. package/src/lib/components/empty-state/CONTEXT.md +2 -1
  115. package/src/lib/components/empty-state/rt-empty-state.component.scss +4 -2
  116. package/src/lib/components/icon/CONTEXT.md +16 -12
  117. package/src/lib/components/icon/rt-icon.component.scss +13 -3
  118. package/src/lib/components/prompt-suggestion/CONTEXT.md +29 -0
  119. package/src/lib/components/prompt-suggestion/rt-prompt-suggestion.component.scss +58 -0
  120. package/src/lib/components/select/CONTEXT.md +2 -2
  121. package/src/lib/components/thread-list/CONTEXT.md +4 -0
  122. package/src/lib/components/thread-list/rt-thread-list.component.scss +29 -0
  123. package/src/lib/components/toolbar/CONTEXT.md +4 -0
  124. package/src/lib/components/toolbar/rt-toolbar.component.scss +7 -0
  125. package/src/rich-editor/lib/components/ai-chat/CONTEXT.md +58 -0
  126. package/src/rich-editor/lib/components/ai-chat/answer/rt-ai-chat-answer.component.scss +12 -0
  127. package/src/rich-editor/lib/components/ai-chat/rt-ai-chat.component.scss +222 -0
  128. package/src/rich-editor/lib/components/rich-editor/rt-rich-editor.component.scss +3 -0
  129. package/src/styles/_scrollbar.scss +9 -0
  130. package/styles/tokens.css +3 -0
  131. package/types/rt-tools-ui-kit-v2-action-bar.d.ts +11 -2
  132. package/types/rt-tools-ui-kit-v2-ai-run-status.d.ts +49 -0
  133. package/types/rt-tools-ui-kit-v2-aside.d.ts +9 -1
  134. package/types/rt-tools-ui-kit-v2-copy-value.d.ts +29 -0
  135. package/types/rt-tools-ui-kit-v2-core.d.ts +94 -54
  136. package/types/rt-tools-ui-kit-v2-data-table.d.ts +7 -0
  137. package/types/rt-tools-ui-kit-v2-dynamic-selector.d.ts +44 -5
  138. package/types/rt-tools-ui-kit-v2-icon.d.ts +12 -4
  139. package/types/rt-tools-ui-kit-v2-prompt-suggestion.d.ts +21 -0
  140. package/types/rt-tools-ui-kit-v2-rich-editor.d.ts +186 -2
  141. package/types/rt-tools-ui-kit-v2-select.d.ts +6 -0
  142. package/types/rt-tools-ui-kit-v2-thread-list.d.ts +15 -2
  143. package/types/rt-tools-ui-kit-v2.d.ts +3 -0
  144. package/rt-tools-ui-kit-v2-0.18.0.tgz +0 -0
@@ -4,22 +4,36 @@
4
4
  /* rt-action-bar — ViewEncapsulation.None: правила таргетируют BEM-класс блока.
5
5
  `.rt-action-bar` — сам хост (шаблон начинается с ng-container, класс ставит host). */
6
6
 
7
+ /* Свойства полосы приложение задаёт на любом предке, хоть на корне страницы: на самой полосе
8
+ объявлены только умолчания с приставкой `-default`, а читается свойство с запасным значением.
9
+ Объявленное на полосе под публичным именем перебило бы правило предка — так было до RT-2619. */
7
10
  .rt-action-bar {
8
- --rt-action-bar-radius: var(--rt-radius-lg);
9
- --rt-action-bar-shadow: var(--rt-shadow-card);
10
- --rt-action-bar-bg: var(--rt-color-bg-inverse);
11
- --rt-action-bar-color: var(--rt-color-text-inverse);
12
- --rt-action-bar-padding: var(--rt-space-2) var(--rt-space-4);
13
- --rt-action-bar-gap: var(--rt-space-4);
14
- --rt-action-bar-font-size: var(--rt-text-sm);
15
- --rt-action-bar-counter-weight: var(--rt-font-weight-medium);
16
- --rt-action-bar-action-radius: var(--rt-radius-md);
17
- --rt-action-bar-action-padding-block: var(--rt-space-1);
18
- --rt-action-bar-action-padding-inline: var(--rt-space-2);
19
- --rt-action-bar-action-weight: var(--rt-font-weight-medium);
20
- --rt-action-bar-action-bg-hover: color-mix(in srgb, var(--rt-action-bar-color) 16%, transparent);
21
- --rt-action-bar-action-color-danger: var(--rt-color-action-danger-on-surface);
22
- --rt-action-bar-action-focus-shadow: var(--rt-shadow-focus-ring);
11
+ --rt-action-bar-radius-default: var(--rt-radius-lg);
12
+ --rt-action-bar-shadow-default: var(--rt-shadow-card);
13
+ --rt-action-bar-bg-default: var(--rt-color-bg-inverse);
14
+ --rt-action-bar-color-default: var(--rt-color-text-inverse);
15
+ --rt-action-bar-padding-default: var(--rt-space-2) var(--rt-space-4);
16
+ --rt-action-bar-gap-default: var(--rt-space-4);
17
+ --rt-action-bar-font-size-default: var(--rt-text-sm);
18
+ --rt-action-bar-counter-weight-default: var(--rt-font-weight-medium);
19
+ --rt-action-bar-counter-font-size-default: 1em;
20
+ --rt-action-bar-action-radius-default: var(--rt-radius-md);
21
+ --rt-action-bar-action-padding-block-default: var(--rt-space-1);
22
+ --rt-action-bar-action-padding-inline-default: var(--rt-space-2);
23
+ --rt-action-bar-action-weight-default: var(--rt-font-weight-medium);
24
+ --rt-action-bar-action-height-default: auto;
25
+ --rt-action-bar-action-font-size-default: 1em;
26
+ --rt-action-bar-action-bg-hover-default: color-mix(
27
+ in srgb,
28
+ var(--rt-action-bar-color, var(--rt-action-bar-color-default)) 16%,
29
+ transparent
30
+ );
31
+ --rt-action-bar-action-color-danger-default: var(--rt-color-action-danger-on-surface);
32
+ --rt-action-bar-action-focus-shadow-default: var(--rt-shadow-focus-ring);
33
+ --rt-action-bar-icon-size-default: var(--rt-size-4);
34
+ --rt-action-bar-icon-gap-default: var(--rt-space-2);
35
+ --rt-action-bar-close-size-default: var(--rt-control-height-sm);
36
+ --rt-action-bar-close-icon-size-default: var(--rt-size-4);
23
37
 
24
38
  // Предел ширины стоит и на самом элементе. Содержащий блок полосы — этот элемент, и
25
39
  // без предела он растёт по содержимому: сто процентов считались бы тогда от выросшего,
@@ -29,16 +43,17 @@
29
43
  max-width: 100%;
30
44
  box-sizing: border-box;
31
45
  align-items: center;
32
- padding: var(--rt-action-bar-padding);
33
- border-radius: var(--rt-action-bar-radius);
34
- background: var(--rt-action-bar-bg);
35
- box-shadow: var(--rt-action-bar-shadow);
36
- color: var(--rt-action-bar-color);
37
- font-size: var(--rt-action-bar-font-size);
38
- gap: var(--rt-action-bar-gap);
46
+ padding: var(--rt-action-bar-padding, var(--rt-action-bar-padding-default));
47
+ border-radius: var(--rt-action-bar-radius, var(--rt-action-bar-radius-default));
48
+ background: var(--rt-action-bar-bg, var(--rt-action-bar-bg-default));
49
+ box-shadow: var(--rt-action-bar-shadow, var(--rt-action-bar-shadow-default));
50
+ color: var(--rt-action-bar-color, var(--rt-action-bar-color-default));
51
+ font-size: var(--rt-action-bar-font-size, var(--rt-action-bar-font-size-default));
52
+ gap: var(--rt-action-bar-gap, var(--rt-action-bar-gap-default));
39
53
 
40
54
  &__counter {
41
- font-weight: var(--rt-action-bar-counter-weight);
55
+ font-size: var(--rt-action-bar-counter-font-size, var(--rt-action-bar-counter-font-size-default));
56
+ font-weight: var(--rt-action-bar-counter-weight, var(--rt-action-bar-counter-weight-default));
42
57
  white-space: nowrap;
43
58
  }
44
59
 
@@ -53,36 +68,46 @@
53
68
 
54
69
  &__action {
55
70
  display: flex;
71
+ min-height: var(--rt-action-bar-action-height, var(--rt-action-bar-action-height-default));
72
+ box-sizing: border-box;
56
73
  align-items: center;
57
- padding: var(--rt-action-bar-action-padding-block) var(--rt-action-bar-action-padding-inline);
74
+ padding: var(--rt-action-bar-action-padding-block, var(--rt-action-bar-action-padding-block-default))
75
+ var(--rt-action-bar-action-padding-inline, var(--rt-action-bar-action-padding-inline-default));
58
76
  border: 0;
59
- border-radius: var(--rt-action-bar-action-radius);
77
+ border-radius: var(--rt-action-bar-action-radius, var(--rt-action-bar-action-radius-default));
60
78
  background: transparent;
61
79
  color: inherit;
62
80
  cursor: pointer;
63
81
  font-family: inherit;
64
- font-size: inherit;
82
+ font-size: var(--rt-action-bar-action-font-size, var(--rt-action-bar-action-font-size-default));
65
83
 
66
84
  // Нажатие в этом ките набрано средним начертанием — так набрана кнопка кита, и
67
85
  // действие полосы такое же нажатие. Первый кит ставил здесь шестьсот.
68
- font-weight: var(--rt-action-bar-action-weight);
69
- gap: var(--rt-space-2);
86
+ font-weight: var(--rt-action-bar-action-weight, var(--rt-action-bar-action-weight-default));
87
+ gap: var(--rt-action-bar-icon-gap, var(--rt-action-bar-icon-gap-default));
70
88
 
71
89
  &:hover {
72
- background: var(--rt-action-bar-action-bg-hover);
90
+ background: var(--rt-action-bar-action-bg-hover, var(--rt-action-bar-action-bg-hover-default));
73
91
  }
74
92
 
75
93
  &:focus-visible {
76
- box-shadow: var(--rt-action-bar-action-focus-shadow);
94
+ box-shadow: var(--rt-action-bar-action-focus-shadow, var(--rt-action-bar-action-focus-shadow-default));
77
95
  outline: none;
78
96
  }
79
97
 
80
98
  &--danger {
81
- color: var(--rt-action-bar-action-color-danger);
99
+ color: var(--rt-action-bar-action-color-danger, var(--rt-action-bar-action-color-danger-default));
82
100
  }
83
101
  }
84
102
 
103
+ // Значок ставит свой размер строкой стиля, и свойство полосы берёт верх через min и max —
104
+ // так же делает заглушка пустого состояния. Глиф шрифта Material без пары в наборе кита
105
+ // держит кегль своего шага: его значок пишет строкой стиля на самом глифе.
85
106
  &__action-icon {
107
+ min-width: var(--rt-action-bar-icon-size, var(--rt-action-bar-icon-size-default));
108
+ max-width: var(--rt-action-bar-icon-size, var(--rt-action-bar-icon-size-default));
109
+ min-height: var(--rt-action-bar-icon-size, var(--rt-action-bar-icon-size-default));
110
+ max-height: var(--rt-action-bar-icon-size, var(--rt-action-bar-icon-size-default));
86
111
  flex: none;
87
112
  }
88
113
 
@@ -101,11 +126,25 @@
101
126
  // белому, и крестика не было видно ни в одном кадре. Своё свойство блока перебивают —
102
127
  // так делает просмотр фотографии, где кнопка стоит на снимке.
103
128
  &__close {
104
- --rt-icon-button-color: var(--rt-action-bar-color);
105
- --rt-icon-button-color-bg-hover: var(--rt-action-bar-action-bg-hover);
129
+ --rt-icon-button-color: var(--rt-action-bar-color, var(--rt-action-bar-color-default));
130
+ --rt-icon-button-color-bg-hover: var(--rt-action-bar-action-bg-hover, var(--rt-action-bar-action-bg-hover-default));
106
131
 
107
132
  flex: none;
108
133
  margin-left: auto;
134
+
135
+ // Размер кнопки — шаг самой иконочной кнопки: `--rt-icon-button-size` — ручка приложения,
136
+ // и кит её не объявляет. Шаг объявлен на внутренней кнопке правилом из двух классов,
137
+ // поэтому здесь три: хост с классом элемента и внутренняя кнопка.
138
+ &.rt-icon-button .rt-icon-button {
139
+ --rt-icon-button-size-step: var(--rt-action-bar-close-size, var(--rt-action-bar-close-size-default));
140
+ }
141
+
142
+ .rt-icon {
143
+ min-width: var(--rt-action-bar-close-icon-size, var(--rt-action-bar-close-icon-size-default));
144
+ max-width: var(--rt-action-bar-close-icon-size, var(--rt-action-bar-close-icon-size-default));
145
+ min-height: var(--rt-action-bar-close-icon-size, var(--rt-action-bar-close-icon-size-default));
146
+ max-height: var(--rt-action-bar-close-icon-size, var(--rt-action-bar-close-icon-size-default));
147
+ }
109
148
  }
110
149
 
111
150
  // Меню рисуется в оверлее, вне полосы: объявление на полосе до него не доходит, и раньше
@@ -115,14 +154,23 @@
115
154
  &__menu {
116
155
  --rt-action-bar-menu-radius-default: var(--rt-radius-md);
117
156
  --rt-action-bar-menu-shadow-default: var(--rt-shadow-card);
157
+ --rt-action-bar-menu-padding-default: var(--rt-space-2);
158
+ --rt-action-bar-menu-gap-default: 0;
159
+ --rt-action-bar-menu-item-font-size-default: var(--rt-text-sm);
118
160
 
119
161
  display: flex;
120
162
  flex-direction: column;
121
- padding: var(--rt-space-2);
163
+ padding: var(--rt-action-bar-menu-padding, var(--rt-action-bar-menu-padding-default));
122
164
  border-radius: var(--rt-action-bar-menu-radius, var(--rt-action-bar-menu-radius-default));
123
165
  background: var(--rt-action-bar-menu-bg, var(--rt-color-bg-surface));
124
166
  box-shadow: var(--rt-action-bar-menu-shadow, var(--rt-action-bar-menu-shadow-default));
125
167
  color: var(--rt-action-bar-menu-color, var(--rt-color-text-primary));
168
+ gap: var(--rt-action-bar-menu-gap, var(--rt-action-bar-menu-gap-default));
169
+
170
+ // Кегль пункта у пункта меню свой; меню полосы переназначает его правилом большей силы.
171
+ .rt-menu-item {
172
+ font-size: var(--rt-action-bar-menu-item-font-size, var(--rt-action-bar-menu-item-font-size-default));
173
+ }
126
174
  }
127
175
 
128
176
  // Полоса живёт на нижней кромке, и пальцу нужно место, которое занимают подписи. Решает
@@ -0,0 +1,41 @@
1
+ # `rt-ai-run-status`
2
+
3
+ ```html
4
+ <rt-ai-run-status [state]="run.state" [label]="run.label" [meta]="run.meta" [steps]="run.steps" [(expanded)]="stepsOpen" />
5
+ ```
6
+
7
+ | вход | тип | умолчание |
8
+ | ---------- | ----------------------------- | ----------------------------- |
9
+ | `state` | `IRtAiRunStatus.State` | обязателен |
10
+ | `label` | `string` | обязателен |
11
+ | `meta` | `string` | `''` — не рисуется |
12
+ | `steps` | `readonly IRtTimeline.Step[]` | `[]` — строку нельзя раскрыть |
13
+ | `expanded` | `boolean` (`model`) | `false` |
14
+
15
+ Выход: `expandedChange` — от `model` раскрытия.
16
+
17
+ Спек — `docs/specs/ui-kit-v2/ai-run-status/`; здесь только устройство папки.
18
+
19
+ ## Главное, что нужно знать
20
+
21
+ **Строка презентационная.** Состояние, подпись, мета и шаги приходят готовыми: разбор потока
22
+ событий модели и подсчёт времени — дело приложения.
23
+
24
+ **С шагами вся строка — кнопка.** Без шагов кнопки нет, строка объявляется `role="status"`.
25
+ `aria-expanded` и `aria-controls` стоят на кнопке, `id` — на ленте шагов.
26
+
27
+ ## Края
28
+
29
+ - Блик подписи — градиент, обрезанный по тексту, и он бежит анимацией. Перелив из четырёх цветов
30
+ (`-shimmer-to`, `-shimmer-2…4`) между приглушённым текстом; проход 2,4 с: при 500 мс блик
31
+ мелькал, владелец попросил медленнее и разноцветный. При
32
+ `prefers-reduced-motion` анимации нет, подпись стоит цветом `--rt-ai-run-status-shimmer-from`.
33
+ - Крутилка переливается теми же цветами: метка анимирует `color` (`rt-ai-run-status-hue`), а
34
+ спиннеру внутри задан `--rt-spinner-progress-color: currentcolor`. Это публичный токен
35
+ спиннера, его ключевые кадры не трогаются. Без анимации крутилка стоит `-shimmer-to`.
36
+ - `expanded` при пустом `steps` ничего не раскрывает: список рисуется только при шагах.
37
+
38
+ ## Рядом
39
+
40
+ - [`rt-timeline`](../timeline/CONTEXT.md) — лента шагов под строкой.
41
+ - [`rt-spinner`](../spinner/CONTEXT.md) — крутилка состояния `running`.
@@ -0,0 +1,158 @@
1
+ @layer rt-kit.components {
2
+ /* rt-ai-run-status — строка хода работы ассистента. ViewEncapsulation.None.
3
+ Класс блока висит и на хосте, и на корне шаблона, поэтому правила вложены в хост. */
4
+
5
+ rt-ai-run-status {
6
+ display: block;
7
+
8
+ .rt-ai-run-status {
9
+ --rt-ai-run-status-radius: var(--rt-radius-sm);
10
+ --rt-ai-run-status-focus-shadow: var(--rt-shadow-focus-ring);
11
+ --rt-ai-run-status-shimmer-duration: 2.4s;
12
+ --rt-ai-run-status-shimmer-from: var(--rt-color-text-muted);
13
+ --rt-ai-run-status-shimmer-to: var(--rt-color-action-primary-on-surface);
14
+ --rt-ai-run-status-shimmer-2: var(--rt-info-500);
15
+ --rt-ai-run-status-shimmer-3: var(--rt-success-400);
16
+ --rt-ai-run-status-shimmer-4: var(--rt-amber-400);
17
+
18
+ display: flex;
19
+ flex-direction: column;
20
+ gap: var(--rt-space-2xs);
21
+
22
+ &__row {
23
+ display: inline-flex;
24
+ align-items: center;
25
+ align-self: flex-start;
26
+ padding: var(--rt-space-2xs) 0;
27
+ border: 0;
28
+ border-radius: var(--rt-ai-run-status-radius);
29
+ margin: 0;
30
+ background: transparent;
31
+ color: inherit;
32
+ font: inherit;
33
+ gap: var(--rt-space-sm);
34
+ text-align: start;
35
+ }
36
+
37
+ button.rt-ai-run-status__row {
38
+ cursor: pointer;
39
+
40
+ &:focus-visible {
41
+ box-shadow: var(--rt-ai-run-status-focus-shadow);
42
+ outline: 2px solid transparent;
43
+ outline-offset: 2px;
44
+ }
45
+
46
+ &:hover .rt-ai-run-status__chevron {
47
+ color: var(--rt-color-text-primary);
48
+ }
49
+ }
50
+
51
+ &__mark {
52
+ display: inline-flex;
53
+ flex: none;
54
+ align-items: center;
55
+ justify-content: center;
56
+ block-size: 16px;
57
+ inline-size: 16px;
58
+
59
+ .rt-spinner {
60
+ --rt-spinner-progress-color: currentcolor;
61
+ }
62
+ }
63
+
64
+ &--state--running .rt-ai-run-status__mark {
65
+ animation: rt-ai-run-status-hue var(--rt-ai-run-status-shimmer-duration) linear infinite;
66
+ color: var(--rt-ai-run-status-shimmer-to);
67
+ }
68
+
69
+ &__label {
70
+ color: var(--rt-color-text-primary);
71
+ font-size: var(--rt-text-sm);
72
+ line-height: var(--rt-leading-snug);
73
+
74
+ &--state--running {
75
+ animation: rt-ai-run-status-shimmer var(--rt-ai-run-status-shimmer-duration) linear infinite;
76
+ background: linear-gradient(
77
+ 90deg,
78
+ var(--rt-ai-run-status-shimmer-from) 0%,
79
+ var(--rt-ai-run-status-shimmer-to) 20%,
80
+ var(--rt-ai-run-status-shimmer-2) 35%,
81
+ var(--rt-ai-run-status-shimmer-3) 50%,
82
+ var(--rt-ai-run-status-shimmer-4) 65%,
83
+ var(--rt-ai-run-status-shimmer-from) 80%,
84
+ var(--rt-ai-run-status-shimmer-from) 100%
85
+ );
86
+ background-clip: text;
87
+ background-size: 200% 100%;
88
+ color: transparent;
89
+ }
90
+
91
+ &--state--stopped {
92
+ color: var(--rt-color-text-muted);
93
+ }
94
+
95
+ &--state--failed {
96
+ color: var(--rt-color-action-danger-on-surface);
97
+ }
98
+ }
99
+
100
+ &__meta {
101
+ flex: none;
102
+ color: var(--rt-color-text-muted);
103
+ font-size: var(--rt-text-xs);
104
+ line-height: var(--rt-leading-snug);
105
+ }
106
+
107
+ &__chevron {
108
+ flex: none;
109
+ color: var(--rt-color-text-muted);
110
+ }
111
+
112
+ &__steps {
113
+ padding-inline-start: var(--rt-space-2xs);
114
+ }
115
+ }
116
+ }
117
+
118
+ @keyframes rt-ai-run-status-shimmer {
119
+ 0% {
120
+ background-position: 100% 0;
121
+ }
122
+
123
+ 100% {
124
+ background-position: -100% 0;
125
+ }
126
+ }
127
+
128
+ @keyframes rt-ai-run-status-hue {
129
+ 0%,
130
+ 100% {
131
+ color: var(--rt-ai-run-status-shimmer-to);
132
+ }
133
+
134
+ 25% {
135
+ color: var(--rt-ai-run-status-shimmer-2);
136
+ }
137
+
138
+ 50% {
139
+ color: var(--rt-ai-run-status-shimmer-3);
140
+ }
141
+
142
+ 75% {
143
+ color: var(--rt-ai-run-status-shimmer-4);
144
+ }
145
+ }
146
+
147
+ @media (prefers-reduced-motion: reduce) {
148
+ .rt-ai-run-status--state--running .rt-ai-run-status__mark {
149
+ animation: none;
150
+ }
151
+
152
+ .rt-ai-run-status__label--state--running {
153
+ animation: none;
154
+ background: none;
155
+ color: var(--rt-ai-run-status-shimmer-from);
156
+ }
157
+ }
158
+ }
@@ -35,6 +35,7 @@ ref.afterClosed().subscribe((result?: ITour): void => …);
35
35
  | `closeOnBackdropClick` / `closeOnEscape` | `true`; второе — из настроек кита |
36
36
  | `backdropClass` / `panelClass` | `rt-aside-backdrop` / `rt-aside-overlay` |
37
37
  | `injector` | корневой — уничтожение хозяина закрывает |
38
+ | `disposeOnNavigation` | `true` — переход по адресу снимает |
38
39
 
39
40
  ## Главное, что нужно знать
40
41
 
@@ -2,12 +2,15 @@
2
2
  /* rt-aside-header — заголовок side-sheet'а. ViewEncapsulation.None.
3
3
  Селекторы префиксованы `.rt-aside-header`. */
4
4
 
5
+ /* Свойства шапки — рукоятки приложения: каждое читается как `--rt-aside-header-*` с любого
6
+ предка (панели оверлея, своего контейнера), а на самом блоке стоит только умолчание под
7
+ `-default`. Значение, объявленное на блоке под публичным именем, перебило бы предка. */
5
8
  .rt-aside-header {
6
- --rt-aside-header-title-size: var(--rt-text-xl);
7
- --rt-aside-header-title-weight: var(--rt-font-weight-bold);
8
- --rt-aside-header-subtitle-size: var(--rt-text-sm);
9
- --rt-aside-header-gap: var(--rt-space-sm);
10
- --rt-aside-header-min-height: auto;
9
+ --rt-aside-header-title-size-default: var(--rt-text-xl);
10
+ --rt-aside-header-title-weight-default: var(--rt-font-weight-bold);
11
+ --rt-aside-header-subtitle-size-default: var(--rt-text-sm);
12
+ --rt-aside-header-gap-default: var(--rt-space-sm);
13
+ --rt-aside-header-min-height-default: auto;
11
14
 
12
15
  /* Отступ шапки — ручка приложения; без неё общий инсет панели. */
13
16
  padding: var(--rt-aside-header-inset, var(--rt-aside-inset));
@@ -15,15 +18,28 @@
15
18
  &__content {
16
19
  display: flex;
17
20
  min-width: 0;
18
- min-height: var(--rt-aside-header-min-height);
21
+ min-height: var(--rt-aside-header-min-height, var(--rt-aside-header-min-height-default));
19
22
  align-items: center;
20
- gap: var(--rt-aside-header-gap);
23
+ gap: var(--rt-aside-header-gap, var(--rt-aside-header-gap-default));
21
24
  }
22
25
 
26
+ /* Кнопка «назад» — шаг `sm` кнопки и значка. Размеры кнопки и значка — рукоятки
27
+ `--rt-aside-header-back-size` и `--rt-aside-header-back-icon-size` с любого предка; без них
28
+ стоят те же шаги. Значок читает свою ступень `sm` на этом узле: ступень, заданная
29
+ приложением выше, сюда не доходит — у кнопки «назад» своя рукоятка. */
23
30
  &__back {
31
+ --rt-icon-step-sm: var(--rt-aside-header-back-icon-size, var(--rt-size-4));
32
+
24
33
  flex-shrink: 0;
25
34
  }
26
35
 
36
+ /* Шаг кнопки переназначается на её внутреннем узле: модификатор размера объявляет его там
37
+ же. Вес селектора выше модификатора, а публичная `--rt-icon-button-size` по-прежнему
38
+ важнее шага. */
39
+ & &__back .rt-icon-button {
40
+ --rt-icon-button-size-step: var(--rt-aside-header-back-size, var(--rt-control-height-sm));
41
+ }
42
+
27
43
  /* Колонка overline + title. flex/min-width живут здесь, чтобы ellipsis
28
44
  у title работал и в двухстрочном варианте. */
29
45
  &__heading {
@@ -49,8 +65,8 @@
49
65
  min-width: 0;
50
66
  margin: 0;
51
67
  color: var(--rt-color-text-primary);
52
- font-size: var(--rt-aside-header-title-size);
53
- font-weight: var(--rt-aside-header-title-weight);
68
+ font-size: var(--rt-aside-header-title-size, var(--rt-aside-header-title-size-default));
69
+ font-weight: var(--rt-aside-header-title-weight, var(--rt-aside-header-title-weight-default));
54
70
 
55
71
  /* Высота строки — ручка приложения; без неё наследуется, как было. */
56
72
  line-height: var(--rt-aside-header-title-leading, inherit);
@@ -71,7 +87,7 @@
71
87
  &__subtitle {
72
88
  margin: 0;
73
89
  color: var(--rt-color-text-muted);
74
- font-size: var(--rt-aside-header-subtitle-size);
90
+ font-size: var(--rt-aside-header-subtitle-size, var(--rt-aside-header-subtitle-size-default));
75
91
  line-height: var(--rt-leading-snug);
76
92
  }
77
93
 
@@ -98,7 +114,7 @@
98
114
  не занимает. */
99
115
  &__row {
100
116
  min-width: 0;
101
- margin-top: var(--rt-aside-header-gap);
117
+ margin-top: var(--rt-aside-header-gap, var(--rt-aside-header-gap-default));
102
118
 
103
119
  &:empty {
104
120
  display: none;
@@ -0,0 +1,31 @@
1
+ # `rt-copy-value`
2
+
3
+ ```html
4
+ <rt-copy-value label="Reference" copyLabel="Copy reference" [value]="error.referenceId" />
5
+ ```
6
+
7
+ | вход | тип | умолчание |
8
+ | ----------- | -------- | ---------------------------- |
9
+ | `value` | `string` | обязателен |
10
+ | `label` | `string` | `''` — не рисуется |
11
+ | `copyLabel` | `string` | `''` → переведённое `uiCopy` |
12
+
13
+ Выход: `copiedValue` — значение, ушедшее в буфер.
14
+
15
+ Спек — `docs/specs/ui-kit-v2/copy-value/`; здесь только устройство папки.
16
+
17
+ ## Главное, что нужно знать
18
+
19
+ **Копируется ровно `value`.** Отображаемое и копируемое совпадают: значение стоит на подложке
20
+ целиком, длинное обрезается многоточием, но в буфер уходит полностью.
21
+
22
+ ## Края
23
+
24
+ - После нажатия подпись кнопки две секунды «Copied», иконка — галочка; таймер гасится при
25
+ уничтожении.
26
+ - Корень шаблона — `ng-container`: класс блока висит только на хосте.
27
+
28
+ ## Рядом
29
+
30
+ - [`rt-copy-cell`](../table/copy-cell/rt-copy-cell.component.ts) — копирование в ячейке таблицы,
31
+ с кнопкой по наведению и проекцией содержимого.
@@ -0,0 +1,39 @@
1
+ @layer rt-kit.components {
2
+ /* rt-copy-value — значение с кнопкой копирования. ViewEncapsulation.None.
3
+ Корень шаблона — ng-container, поэтому класс блока висит только на хосте. */
4
+
5
+ .rt-copy-value {
6
+ --rt-copy-value-radius: var(--rt-radius-sm);
7
+
8
+ display: inline-flex;
9
+ align-items: center;
10
+ gap: var(--rt-space-sm);
11
+ max-inline-size: 100%;
12
+ min-inline-size: 0;
13
+
14
+ &__label {
15
+ flex: none;
16
+ color: var(--rt-color-text-muted);
17
+ font-size: var(--rt-text-xs);
18
+ line-height: var(--rt-leading-snug);
19
+ }
20
+
21
+ &__value {
22
+ overflow: hidden;
23
+ padding: var(--rt-space-2xs) var(--rt-space-xs);
24
+ border-radius: var(--rt-copy-value-radius);
25
+ background: var(--rt-color-bg-surface-subtle);
26
+ color: var(--rt-color-text-primary);
27
+ font-size: var(--rt-text-xs);
28
+ font-weight: var(--rt-font-weight-medium);
29
+ line-height: var(--rt-leading-snug);
30
+ min-inline-size: 0;
31
+ text-overflow: ellipsis;
32
+ white-space: nowrap;
33
+ }
34
+
35
+ &__button {
36
+ flex: none;
37
+ }
38
+ }
39
+ }
@@ -136,11 +136,11 @@
136
136
  --rt-data-list-settings-aside-header-height: 96px;
137
137
 
138
138
  .rt-aside-header {
139
- --rt-aside-header-title-size: var(--rt-text-2xl);
140
- --rt-aside-header-title-weight: var(--rt-font-weight-semibold);
141
- --rt-aside-header-subtitle-size: var(--rt-text-md);
142
- --rt-aside-header-gap: var(--rt-space-md);
143
- --rt-aside-header-min-height: var(--rt-data-list-settings-aside-header-height);
139
+ --rt-aside-header-title-size-default: var(--rt-text-2xl);
140
+ --rt-aside-header-title-weight-default: var(--rt-font-weight-semibold);
141
+ --rt-aside-header-subtitle-size-default: var(--rt-text-md);
142
+ --rt-aside-header-gap-default: var(--rt-space-md);
143
+ --rt-aside-header-min-height-default: var(--rt-data-list-settings-aside-header-height);
144
144
  }
145
145
 
146
146
  /* Кнопка «назад» — круглая `mat-icon-button` первого кита, как и кнопки подвала панели. */
@@ -100,3 +100,8 @@
100
100
  - Выбор по одной рисует радиокнопку, и флажка страницы в шапке нет.
101
101
  - Отметки, названные заранее (`selectedEntitiesKeys`), ставятся один раз — к первым непустым
102
102
  строкам; позже присланный набор уже ничего не переписывает.
103
+
104
+ ## Ячейка отбора: фокус после сброса
105
+
106
+ `rt-data-table-filter-cell.onClear` после сброса даты или списка переводит фокус в поле рядом.
107
+ Крестик без значения выключается, и выключенная кнопка роняла фокус на `body`.
@@ -24,6 +24,12 @@
24
24
  **Отметки всплывающего окна уходят только по «Применить».** «Отмена», `Escape` и щелчок мимо
25
25
  снимают их, значение остаётся прежним.
26
26
 
27
+ **Вид приглашения, очистки, поиска и пустого результата задаёт приложение входами.** Значок и вид
28
+ кнопки приглашения — `invitationButtonIcon` и `invitationButtonAppearance`, значок очистки —
29
+ `clearIcon`, вид поля поиска окна — `searchAppearance`, подпись пустого результата —
30
+ `emptyResultsText`; у поля строк вид поля новой строки — `fieldAppearance`. Цвет кнопки «Добавить»
31
+ — ручка `--rt-dynamic-selector-list-add-color`: кнопку проецируют оба поля, и вид у неё разный.
32
+
27
33
  **Поле строк срезает пробелы по краям и не добавляет пустое и повторное.** Повтор сравнивается
28
34
  точно, с учётом регистра.
29
35
 
@@ -37,6 +43,18 @@
37
43
  - Приглашение (`invitation`) встаёт вместо полосы кнопок; его кнопка открывает тот же выбор.
38
44
  `listActionsShown = false` убирает сброс и очистку, оставляя кнопку добавления;
39
45
  `removeShown = false` убирает корзину строк.
46
+ Рисунок приглашения — значок кита `invitationIcon` или имя Material `invitationGlyph`; при обоих
47
+ рисуется значок кита.
48
+ - Подпись поля — обёртка `rt-field` с `label`, как у любого поля кита. У поля строк она ведёт к полю
49
+ новой строки, пока оно открыто.
50
+ - Выбранное без формы — вход `chosenEntities`: непустой список с другими ключами становится и
51
+ значением, и списком для «Сбросить»; эхо выбора от родителя ничего не меняет.
52
+ - `titleWrap="false"` — название строки одной строкой с многоточием и подсказкой при обрезке.
53
+ - Подпись самого поля новой строки — вход `fieldLabel`: поле встаёт в `rt-field` с этой подписью.
54
+ Без подписи обёртки нет, и поле стоит как раньше.
55
+ - Вид кнопки приглашения, значок очистки, вид поиска, подпись пустого результата и перенос названия
56
+ строки приложение задаёт один раз — `provideRtKit({ components: { dynamicSelector: { … } } })`.
57
+ Вход на месте сильнее, без настроек остаются умолчания кита.
40
58
  - Правки в своём шаблоне строки — `extraChanged`: сброс и очистка включены при прежних ключах и
41
59
  сообщают `listReset` и `listCleared`, значение сброс тогда не трогает.
42
60
  - Начальный запрос окна — `searchTerm`, событием поиска он не уходит. Открыто ли окно — сигнал