@rt-tools/ui-kit-v2 0.13.1 → 0.14.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 +25 -5
- package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs +45 -9
- package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2.mjs +2265 -664
- package/fesm2022/rt-tools-ui-kit-v2.mjs.map +1 -1
- package/package.json +1 -1
- package/rt-tools-ui-kit-v2-0.14.0.tgz +0 -0
- package/src/lib/components/CONTEXT.md +1 -1
- package/src/lib/components/action-bar/rt-action-bar.component.scss +5 -0
- package/src/lib/components/autocomplete/rt-autocomplete.component.scss +8 -1
- package/src/lib/components/bottom-sheet/rt-bottom-sheet.component.scss +5 -0
- package/src/lib/components/button/CONTEXT.md +1 -1
- package/src/lib/components/button/rt-button.directive.scss +5 -7
- package/src/lib/components/calendar/CONTEXT.md +16 -2
- package/src/lib/components/calendar/rt-calendar.component.scss +81 -4
- package/src/lib/components/card/rt-card.component.scss +5 -0
- package/src/lib/components/checkbox/rt-checkbox.component.scss +5 -0
- package/src/lib/components/data-list/settings/rt-data-list-settings-aside.component.scss +1 -1
- package/src/lib/components/data-list/toolbar/rt-data-list-toolbar.component.scss +1 -1
- package/src/lib/components/data-table/cell/rt-data-table-cell.component.scss +1 -1
- package/src/lib/components/data-table/filter-cell/rt-data-table-filter-cell.component.scss +1 -1
- package/src/lib/components/data-table/rt-data-table.component.scss +1 -1
- package/src/lib/components/date-picker/CONTEXT.md +33 -14
- package/src/lib/components/date-picker/panel/rt-date-panel.component.scss +155 -0
- package/src/lib/components/date-picker/rt-date-picker.component.scss +18 -2
- package/src/lib/components/date-range/CONTEXT.md +53 -0
- package/src/lib/components/date-range/panel/rt-date-range-panel.component.scss +103 -0
- package/src/lib/components/date-range/rt-date-range.component.scss +120 -0
- package/src/lib/components/dialog/rt-dialog.component.scss +5 -0
- package/src/lib/components/empty-state/rt-empty-state.component.scss +5 -0
- package/src/lib/components/file-card/rt-file-card.component.scss +5 -0
- package/src/lib/components/file-drop/rt-file-drop.component.scss +5 -0
- package/src/lib/components/header/rt-header.component.scss +5 -0
- package/src/lib/components/icon-button/CONTEXT.md +1 -1
- package/src/lib/components/icon-button/rt-icon-button.component.scss +9 -29
- package/src/lib/components/input/rt-input.component.scss +7 -1
- package/src/lib/components/input-number/rt-input-number.component.scss +7 -1
- package/src/lib/components/markdown-text/rt-markdown-text.component.scss +5 -0
- package/src/lib/components/menu/rt-menu-item.component.scss +5 -0
- package/src/lib/components/message/rt-message.component.scss +5 -0
- package/src/lib/components/money-list/rt-money-list.component.scss +5 -0
- package/src/lib/components/multiselect/CONTEXT.md +12 -5
- package/src/lib/components/multiselect/rt-multiselect.component.scss +32 -1
- package/src/lib/components/note/rt-note.component.scss +5 -0
- package/src/lib/components/notifications-bell/rt-notifications-bell.component.scss +5 -0
- package/src/lib/components/pagination/rt-pagination.component.scss +6 -1
- package/src/lib/components/radio-button/rt-radio-button.component.scss +5 -0
- package/src/lib/components/section-nav/rt-section-nav.component.scss +5 -0
- package/src/lib/components/select/CONTEXT.md +10 -7
- package/src/lib/components/select/rt-select.component.scss +36 -1
- package/src/lib/components/skeleton/CONTEXT.md +14 -16
- package/src/lib/components/skeleton/rt-skeleton.component.scss +7 -1
- package/src/lib/components/skeleton-wrapper/CONTEXT.md +6 -6
- package/src/lib/components/split-button/rt-split-button.component.scss +6 -0
- package/src/lib/components/stepper/rt-stepper.component.scss +5 -0
- package/src/lib/components/table/rt-table.component.scss +12 -0
- package/src/lib/components/tag/CONTEXT.md +14 -15
- package/src/lib/components/tag/rt-tag.component.scss +6 -30
- package/src/lib/components/textarea/rt-textarea.component.scss +8 -1
- package/src/lib/components/thread-list/rt-thread-list.component.scss +5 -0
- package/src/lib/components/toggle-button-group/rt-toggle-button-group.component.scss +7 -6
- package/src/lib/components/toggle-switch/rt-toggle-switch.component.scss +5 -0
- package/src/rich-editor/lib/components/message-composer/CONTEXT.md +11 -1
- package/src/rich-editor/lib/components/message-composer/rt-message-composer.component.scss +78 -34
- package/src/styles/_mixins.scss +39 -0
- package/styles/tokens.css +30 -5
- package/types/rt-tools-ui-kit-v2-rich-editor.d.ts +11 -5
- package/types/rt-tools-ui-kit-v2.d.ts +394 -109
- package/rt-tools-ui-kit-v2-0.13.1.tgz +0 -0
|
@@ -1,5 +1,8 @@
|
|
|
1
|
+
@use '../../../styles/mixins' as kv;
|
|
2
|
+
|
|
1
3
|
@layer rt-kit.components {
|
|
2
4
|
.rt-date-picker {
|
|
5
|
+
--rt-date-picker-radius: var(--rt-input-radius);
|
|
3
6
|
--rt-date-picker-fill-radius: var(--rt-radius-sm);
|
|
4
7
|
|
|
5
8
|
position: relative;
|
|
@@ -10,7 +13,7 @@
|
|
|
10
13
|
align-items: center;
|
|
11
14
|
padding: var(--rt-input-padding-y) var(--rt-input-padding-x);
|
|
12
15
|
border: var(--rt-input-border-width) solid var(--rt-input-color-border);
|
|
13
|
-
border-radius: var(--rt-
|
|
16
|
+
border-radius: var(--rt-date-picker-radius);
|
|
14
17
|
background-color: var(--rt-input-color-bg);
|
|
15
18
|
color: var(--rt-input-color-text);
|
|
16
19
|
cursor: text;
|
|
@@ -91,14 +94,27 @@
|
|
|
91
94
|
color: inherit;
|
|
92
95
|
font: inherit;
|
|
93
96
|
outline: none;
|
|
97
|
+
text-overflow: ellipsis;
|
|
94
98
|
|
|
95
99
|
&:disabled {
|
|
96
100
|
cursor: not-allowed;
|
|
97
101
|
}
|
|
98
102
|
}
|
|
99
103
|
|
|
100
|
-
&__clear
|
|
104
|
+
&__clear,
|
|
105
|
+
&__open {
|
|
101
106
|
flex-shrink: 0;
|
|
102
107
|
}
|
|
108
|
+
|
|
109
|
+
/* Поверхность панели в поповере: она рисуется в CDK Overlay, вне поддерева блока. */
|
|
110
|
+
&__popup {
|
|
111
|
+
border: var(--rt-overlay-select-panel-border-width) solid var(--rt-color-border-subtle);
|
|
112
|
+
border-radius: var(--rt-overlay-select-radius);
|
|
113
|
+
background-color: var(--rt-color-bg-surface);
|
|
114
|
+
box-shadow: var(--rt-overlay-select-shadow);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/* Шаг входа `radius` переназначает скругление поля; панель в оверлее держит своё. */
|
|
118
|
+
@include kv.radius-steps('--rt-date-picker-radius');
|
|
103
119
|
}
|
|
104
120
|
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# `rt-date-range`
|
|
2
|
+
|
|
3
|
+
```html
|
|
4
|
+
<rt-field label="Период">
|
|
5
|
+
<rt-date-range min="2026-01-01" max="2026-12-31" [formControl]="period" />
|
|
6
|
+
</rt-field>
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
Свои входы поверх общих из [`RtFormControlBase`](../form-control/CONTEXT.md):
|
|
10
|
+
|
|
11
|
+
| вход | тип | умолчание |
|
|
12
|
+
| ------------- | ------------------------------- | ----------- |
|
|
13
|
+
| `min` / `max` | `string \| null` (`YYYY-MM-DD`) | `null` |
|
|
14
|
+
| `appearance` | `'outline' \| 'fill'` | `'outline'` |
|
|
15
|
+
|
|
16
|
+
Значение — пара дней `{ start, end }` в форме `YYYY-MM-DD`, оба края включены, `start` не позже
|
|
17
|
+
`end`; пусто — `null`. Половина диапазона в форму не попадает никогда.
|
|
18
|
+
|
|
19
|
+
## Главное, что нужно знать
|
|
20
|
+
|
|
21
|
+
**Панель — два месяца рядом и быстрые варианты слева.** Кнопка в конце поля открывает
|
|
22
|
+
`rt-date-range-panel`. Первый клик ставит начало, наведение рисует будущий диапазон, второй клик —
|
|
23
|
+
конец; клик раньше начала ставит дни по порядку. Варианты «Сегодня», «Вчера», «Последние 7 и 30
|
|
24
|
+
дней», «Этот месяц» и «Прошлый месяц» заполняют черновик. Подвал показывает даты и число дней,
|
|
25
|
+
«Сбросить» очищает черновик, «Применить» пишет значение. Договорённость —
|
|
26
|
+
`docs/specs/ui-kit-v2/date-range/`.
|
|
27
|
+
|
|
28
|
+
**Текст в поле — две даты в порядке языка интерфейса через тире.** Под `ru` это
|
|
29
|
+
«12.10.2026 — 15.10.2026». Набранный текст читается так же; нечитаемый или лежащий за границами
|
|
30
|
+
оставляет значение прежним и помечает поле ошибкой.
|
|
31
|
+
|
|
32
|
+
**Сетка, текст даты и язык — те же, что у поля даты.** Месяцы рисует
|
|
33
|
+
[`rt-calendar`](../calendar/CONTEXT.md), текст даты пишет логика поля даты, язык берётся из
|
|
34
|
+
`RT_KIT_LOCALE`. Своя арифметика — только диапазона, в `rt-date-range.logic.ts`.
|
|
35
|
+
|
|
36
|
+
## Края
|
|
37
|
+
|
|
38
|
+
- «Этот месяц» — с первого дня месяца по сегодня, «Прошлый месяц» — весь, последние 7 и 30 дней
|
|
39
|
+
кончаются сегодня.
|
|
40
|
+
- Вариант, не лежащий в `min`/`max` целиком, выключен; дни за границами выключены, листание
|
|
41
|
+
останавливается на месяце границы.
|
|
42
|
+
- Клавиши в месяцах — как у панели поля даты; Enter на дне выбирает его, как клик.
|
|
43
|
+
- Число дней в итоге берёт форму множественного числа локали: подписи кита `uiDaysOne`,
|
|
44
|
+
`uiDaysFew`, `uiDaysMany`, `uiDaysOther`.
|
|
45
|
+
- На узком экране панель встаёт в нижнюю шторку: один месяц, варианты строкой сверху с прокруткой
|
|
46
|
+
вбок, дни под палец, в итоге только число дней. Признак узкого экрана даёт
|
|
47
|
+
`BreakpointsService.narrow`.
|
|
48
|
+
- В плоском режиме чтения диапазон пишется по локали через `Intl.DateTimeFormat`; пусто — прочерк.
|
|
49
|
+
|
|
50
|
+
## Рядом
|
|
51
|
+
|
|
52
|
+
- [`rt-date-picker`](../date-picker/CONTEXT.md) — одна дата, время или дата со временем.
|
|
53
|
+
- [`rt-calendar`](../calendar/CONTEXT.md) — сетка месяцев, на которой стоит панель.
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
@layer rt-kit.components {
|
|
2
|
+
/* rt-date-range-panel — ViewEncapsulation.None: правила таргетируют BEM-класс блока, класс ставит host. */
|
|
3
|
+
|
|
4
|
+
.rt-date-range-panel {
|
|
5
|
+
/* Размер дня в шторке: под палец. */
|
|
6
|
+
--rt-date-range-panel-sheet-day-size: calc(var(--rt-size-10) + var(--rt-size-1));
|
|
7
|
+
|
|
8
|
+
/* Толщина черты между вариантами и месяцами и над подвалом. */
|
|
9
|
+
--rt-date-range-panel-divider-width: var(--rt-border-width-thin);
|
|
10
|
+
|
|
11
|
+
display: flex;
|
|
12
|
+
flex-direction: column;
|
|
13
|
+
padding: var(--rt-space-4);
|
|
14
|
+
gap: var(--rt-space-4);
|
|
15
|
+
|
|
16
|
+
&__title {
|
|
17
|
+
margin: 0;
|
|
18
|
+
color: var(--rt-color-text-primary);
|
|
19
|
+
font-size: var(--rt-text-lg);
|
|
20
|
+
font-weight: var(--rt-font-weight-semibold);
|
|
21
|
+
text-align: center;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
&__body {
|
|
25
|
+
display: flex;
|
|
26
|
+
align-items: flex-start;
|
|
27
|
+
gap: var(--rt-space-4);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/* Варианты стоят колонкой слева, отделённые от месяцев чертой. */
|
|
31
|
+
&__presets {
|
|
32
|
+
display: flex;
|
|
33
|
+
flex: 0 0 auto;
|
|
34
|
+
flex-direction: column;
|
|
35
|
+
align-self: stretch;
|
|
36
|
+
padding-right: var(--rt-space-4);
|
|
37
|
+
border-right: var(--rt-date-range-panel-divider-width) solid var(--rt-color-border-subtle);
|
|
38
|
+
gap: var(--rt-space-1);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/* Вариант в колонке — строка текста, прижатая влево, а не кнопка по центру. */
|
|
42
|
+
&__preset {
|
|
43
|
+
justify-content: flex-start;
|
|
44
|
+
white-space: nowrap;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/* Свойство ставится на сам узел календаря — корень его блока объявляет своё. */
|
|
48
|
+
& &__calendar {
|
|
49
|
+
--rt-calendar-day-justify: center;
|
|
50
|
+
--rt-calendar-column-gap: 0;
|
|
51
|
+
--rt-calendar-range-inner-radius: 0;
|
|
52
|
+
|
|
53
|
+
flex: 1 1 auto;
|
|
54
|
+
min-inline-size: calc(var(--rt-size-10) * 14 + var(--rt-space-6));
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
&__footer {
|
|
58
|
+
display: flex;
|
|
59
|
+
align-items: center;
|
|
60
|
+
padding-top: var(--rt-space-2);
|
|
61
|
+
border-top: var(--rt-date-range-panel-divider-width) solid var(--rt-color-border-subtle);
|
|
62
|
+
gap: var(--rt-space-2);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
&__summary {
|
|
66
|
+
flex: 1 1 auto;
|
|
67
|
+
color: var(--rt-color-text-muted);
|
|
68
|
+
font-size: var(--rt-text-sm);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/* Нижняя шторка: варианты строкой сверху с прокруткой вбок, один месяц, дни под палец. */
|
|
72
|
+
&--sheet {
|
|
73
|
+
padding-inline: 0;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
&--sheet &__body {
|
|
77
|
+
flex-direction: column;
|
|
78
|
+
align-items: stretch;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
&--sheet &__presets {
|
|
82
|
+
flex-direction: row;
|
|
83
|
+
padding-right: 0;
|
|
84
|
+
padding-bottom: var(--rt-space-1);
|
|
85
|
+
border-right: none;
|
|
86
|
+
gap: var(--rt-space-2);
|
|
87
|
+
overflow-x: auto;
|
|
88
|
+
overscroll-behavior-x: contain;
|
|
89
|
+
scrollbar-width: none;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
&--sheet &__preset {
|
|
93
|
+
flex: 0 0 auto;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
&--sheet &__calendar {
|
|
97
|
+
--rt-calendar-month-count: 1;
|
|
98
|
+
--rt-calendar-day-size: var(--rt-date-range-panel-sheet-day-size);
|
|
99
|
+
|
|
100
|
+
min-inline-size: 0;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
@use '../../../styles/mixins' as kv;
|
|
2
|
+
|
|
3
|
+
@layer rt-kit.components {
|
|
4
|
+
.rt-date-range {
|
|
5
|
+
--rt-date-range-radius: var(--rt-input-radius);
|
|
6
|
+
--rt-date-range-fill-radius: var(--rt-radius-sm);
|
|
7
|
+
|
|
8
|
+
position: relative;
|
|
9
|
+
display: inline-flex;
|
|
10
|
+
width: 100%;
|
|
11
|
+
min-height: var(--rt-input-height);
|
|
12
|
+
box-sizing: border-box;
|
|
13
|
+
align-items: center;
|
|
14
|
+
padding: var(--rt-input-padding-y) var(--rt-input-padding-x);
|
|
15
|
+
border: var(--rt-input-border-width) solid var(--rt-input-color-border);
|
|
16
|
+
border-radius: var(--rt-date-range-radius);
|
|
17
|
+
background-color: var(--rt-input-color-bg);
|
|
18
|
+
color: var(--rt-input-color-text);
|
|
19
|
+
cursor: text;
|
|
20
|
+
font-size: var(--rt-input-font-size);
|
|
21
|
+
gap: var(--rt-space-sm);
|
|
22
|
+
line-height: var(--rt-input-line-height);
|
|
23
|
+
transition: var(--rt-input-transition);
|
|
24
|
+
|
|
25
|
+
&:focus-within {
|
|
26
|
+
border-color: var(--rt-input-color-border-focus);
|
|
27
|
+
box-shadow: var(--rt-input-focus-shadow);
|
|
28
|
+
outline: 2px solid transparent;
|
|
29
|
+
outline-offset: var(--rt-input-focus-outline-offset);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/* bordered=false: снимаем только resting-рамку; invalid/focus/readonly идут
|
|
33
|
+
ниже по source-order и перекрывают её своей рамкой. */
|
|
34
|
+
&--borderless {
|
|
35
|
+
border-color: transparent;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/* Вид «fill» — залитое поле с чертой снизу, как у материального поля первого кита: скругление
|
|
39
|
+
у него своё и малое — скругление поля бывает «таблеткой», а у залитого поля низ прямой.
|
|
40
|
+
Объявлен до блоков состояний: фокус, ошибка и «только чтение» идут ниже и
|
|
41
|
+
перекрывают его рамку. */
|
|
42
|
+
&--appearance--fill {
|
|
43
|
+
border-color: transparent;
|
|
44
|
+
border-radius: var(--rt-date-range-fill-radius) var(--rt-date-range-fill-radius) 0 0;
|
|
45
|
+
border-bottom-color: var(--rt-color-field-fill-underline);
|
|
46
|
+
background-color: var(--rt-color-bg-surface-subtle-2);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
&--invalid {
|
|
50
|
+
border-color: var(--rt-input-color-border-error);
|
|
51
|
+
|
|
52
|
+
&:focus-within {
|
|
53
|
+
box-shadow: var(--rt-input-focus-shadow-error);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
&--disabled {
|
|
58
|
+
cursor: not-allowed;
|
|
59
|
+
opacity: var(--rt-input-disabled-opacity);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
&--size--sm {
|
|
63
|
+
min-height: var(--rt-input-height-sm);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
&--size--lg {
|
|
67
|
+
min-height: var(--rt-input-height-lg);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/* Read-only: дата как плоский текст — снимаем рамку/фон/паддинги. */
|
|
71
|
+
&--readonly {
|
|
72
|
+
padding-right: 0;
|
|
73
|
+
padding-left: 0;
|
|
74
|
+
border-color: transparent;
|
|
75
|
+
background-color: transparent;
|
|
76
|
+
cursor: default;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
&__readonly {
|
|
80
|
+
color: var(--rt-field-value-color);
|
|
81
|
+
font-size: var(--rt-field-value-font-size);
|
|
82
|
+
|
|
83
|
+
&--empty {
|
|
84
|
+
color: var(--rt-field-value-empty-color);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
&__field {
|
|
89
|
+
min-width: 0;
|
|
90
|
+
flex: 1 1 auto;
|
|
91
|
+
padding: 0;
|
|
92
|
+
border: none;
|
|
93
|
+
background: transparent;
|
|
94
|
+
color: inherit;
|
|
95
|
+
font: inherit;
|
|
96
|
+
outline: none;
|
|
97
|
+
text-overflow: ellipsis;
|
|
98
|
+
|
|
99
|
+
&:disabled {
|
|
100
|
+
cursor: not-allowed;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
&__clear,
|
|
105
|
+
&__open {
|
|
106
|
+
flex-shrink: 0;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/* Поверхность панели в поповере: она рисуется в CDK Overlay, вне поддерева блока. */
|
|
110
|
+
&__popup {
|
|
111
|
+
border: var(--rt-overlay-select-panel-border-width) solid var(--rt-color-border-subtle);
|
|
112
|
+
border-radius: var(--rt-overlay-select-radius);
|
|
113
|
+
background-color: var(--rt-color-bg-surface);
|
|
114
|
+
box-shadow: var(--rt-overlay-select-shadow);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/* Шаг входа `radius` переназначает скругление поля; панель в оверлее держит своё. */
|
|
118
|
+
@include kv.radius-steps('--rt-date-range-radius');
|
|
119
|
+
}
|
|
120
|
+
}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
@use '../../../styles/mixins' as kv;
|
|
2
|
+
|
|
1
3
|
@layer rt-kit.components {
|
|
2
4
|
/* rt-dialog — styled frame модалки поверх CDK Overlay.
|
|
3
5
|
ViewEncapsulation.None — селекторы префиксованы `.rt-dialog`.
|
|
@@ -9,6 +11,9 @@
|
|
|
9
11
|
становится: рамка должна быть прямым flex-ребёнком overlay-панели. */
|
|
10
12
|
rt-dialog {
|
|
11
13
|
display: contents;
|
|
14
|
+
|
|
15
|
+
/* Шаг входа `radius` переназначает скругление рамки. */
|
|
16
|
+
@include kv.radius-steps('--rt-dialog-radius', '> .rt-dialog');
|
|
12
17
|
}
|
|
13
18
|
|
|
14
19
|
/* Size tokens — sm/md/lg.
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
@use '../../../styles/mixins' as kv;
|
|
2
|
+
|
|
1
3
|
@layer rt-kit.components {
|
|
2
4
|
/* rt-empty-state — заглушка пустого состояния в common/ui (ViewEncapsulation.None).
|
|
3
5
|
Селектор bare `.rt-empty-state` (класс на host) — `:host` в None light-DOM не матчит.
|
|
@@ -72,5 +74,8 @@
|
|
|
72
74
|
|
|
73
75
|
margin-top: var(--rt-space-sm);
|
|
74
76
|
}
|
|
77
|
+
|
|
78
|
+
/* Шаг входа `radius` переназначает скругление подложки значка. */
|
|
79
|
+
@include kv.radius-steps('--rt-empty-state-icon-radius');
|
|
75
80
|
}
|
|
76
81
|
}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
@use '../../../styles/mixins' as kv;
|
|
2
|
+
|
|
1
3
|
@layer rt-kit.components {
|
|
2
4
|
/* rt-file-card — ViewEncapsulation.None, плоский `.rt-file-card` (как rt-file-input/rt-icon).
|
|
3
5
|
Host-класс ставится через @Component host:{class}. */
|
|
@@ -112,5 +114,8 @@
|
|
|
112
114
|
&__action {
|
|
113
115
|
flex-shrink: 0;
|
|
114
116
|
}
|
|
117
|
+
|
|
118
|
+
/* Шаг входа `radius` переназначает скругление карточки; значок держит своё. */
|
|
119
|
+
@include kv.radius-steps('--rt-file-card-radius');
|
|
115
120
|
}
|
|
116
121
|
}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
@use '../../../styles/mixins' as kv;
|
|
2
|
+
|
|
1
3
|
@layer rt-kit.components {
|
|
2
4
|
/* rt-file-drop — зона перетаскивания файлов в common/ui (ViewEncapsulation.None).
|
|
3
5
|
Селектор bare `.rt-file-drop` (класс на host) — `:host` в None light-DOM не матчит.
|
|
@@ -113,6 +115,9 @@
|
|
|
113
115
|
font-size: var(--rt-text-sm);
|
|
114
116
|
opacity: 0.8;
|
|
115
117
|
}
|
|
118
|
+
|
|
119
|
+
/* Шаг входа `radius` переназначает скругление зоны. */
|
|
120
|
+
@include kv.radius-steps('--rt-file-drop-radius');
|
|
116
121
|
}
|
|
117
122
|
|
|
118
123
|
/* Сжатый вид подсказки. Слова подсказки пишет сам кит, и на низкой области они не
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
@use '../../../styles/mixins' as kv;
|
|
2
|
+
|
|
1
3
|
@layer rt-kit.components {
|
|
2
4
|
.rt-header {
|
|
3
5
|
--rt-header-radius: var(--rt-radius-lg);
|
|
@@ -58,6 +60,9 @@
|
|
|
58
60
|
flex: 1 0 0;
|
|
59
61
|
align-items: center;
|
|
60
62
|
}
|
|
63
|
+
|
|
64
|
+
/* Шаг входа `radius` переназначает скругление нижних углов. */
|
|
65
|
+
@include kv.radius-steps('--rt-header-radius');
|
|
61
66
|
}
|
|
62
67
|
|
|
63
68
|
/* dark override: подложка обвязки — своё назначение, а не ступень шкалы. */
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
| `size` | `'sm' \| 'md' \| 'lg' \| 'xl' \| '2xl'` | `'md'` |
|
|
13
13
|
| `iconSize` | `IRtIcon.Size \| null` | `null` → от размера кнопки |
|
|
14
14
|
| `iconColor` | `IRtIcon.Color` | `'current'` |
|
|
15
|
-
| `
|
|
15
|
+
| `radius` | `TRtRadius \| null` — шаг общей шкалы | `null` → `md` |
|
|
16
16
|
| `type` | `'button' \| 'submit'` | `'button'` |
|
|
17
17
|
| `tooltip` | `string` | `''` (пусто → подсказки нет) |
|
|
18
18
|
| `tabIndex` | `number` | `0` |
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
@use '../../../styles/mixins' as kv;
|
|
2
|
+
|
|
1
3
|
@layer rt-kit.components {
|
|
2
4
|
/* rt-icon-button — иконочная кнопка в common/ui. ViewEncapsulation.None.
|
|
3
5
|
Хост адресуется по имени элемента, а не по классу блока: класс `.rt-icon-button` висит
|
|
@@ -19,19 +21,9 @@
|
|
|
19
21
|
--rt-icon-button-color: var(--rt-color-text-primary);
|
|
20
22
|
|
|
21
23
|
.rt-icon-button {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
/* Промежуточные формы делят расстояние от квадрата до круга на три равные
|
|
26
|
-
части, а не берут свою долю стороны. Доля, взятая сама по себе, промахивается
|
|
27
|
-
мимо квадрата: у него радиус в 8 пикселей, а это от четверти стороны на
|
|
28
|
-
кнопке в 32 пикселя до восьмой на кнопке в 64 — ближняя ступень сливается с
|
|
29
|
-
ним на одних размерах и отрывается на других. Отсчёт от самого квадрата
|
|
30
|
-
держит шаг ровным на всём ряду: 8 → 12 → 16 → 20 на кнопке в 40 пикселей. */
|
|
31
|
-
--rt-icon-button-rounded-sm-radius: calc(var(--rt-icon-button-square-radius) + (50% - var(--rt-icon-button-square-radius)) / 3);
|
|
32
|
-
--rt-icon-button-rounded-lg-radius: calc(
|
|
33
|
-
var(--rt-icon-button-square-radius) + (50% - var(--rt-icon-button-square-radius)) * 2 / 3
|
|
34
|
-
);
|
|
24
|
+
/* Скругление по умолчанию — скруглённый квадрат; круг и любой другой шаг даёт вход
|
|
25
|
+
`radius`. */
|
|
26
|
+
--rt-icon-button-radius: var(--rt-radius-md);
|
|
35
27
|
--rt-icon-button-indicator-radius: var(--rt-radius-full);
|
|
36
28
|
--rt-icon-button-focus-shadow: var(--rt-shadow-focus-ring);
|
|
37
29
|
|
|
@@ -58,6 +50,7 @@
|
|
|
58
50
|
justify-content: center;
|
|
59
51
|
padding: 0;
|
|
60
52
|
border: 0;
|
|
53
|
+
border-radius: var(--rt-icon-button-radius);
|
|
61
54
|
background-color: var(--rt-icon-button-bg);
|
|
62
55
|
box-shadow: var(--rt-icon-button-shadow);
|
|
63
56
|
color: var(--rt-icon-button-color);
|
|
@@ -86,22 +79,6 @@
|
|
|
86
79
|
--rt-icon-button-size: var(--rt-control-height-2xl);
|
|
87
80
|
}
|
|
88
81
|
|
|
89
|
-
&--circle {
|
|
90
|
-
border-radius: var(--rt-icon-button-circle-radius);
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
&--rounded-sm {
|
|
94
|
-
border-radius: var(--rt-icon-button-rounded-sm-radius);
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
&--rounded-lg {
|
|
98
|
-
border-radius: var(--rt-icon-button-rounded-lg-radius);
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
&--square {
|
|
102
|
-
border-radius: var(--rt-icon-button-square-radius);
|
|
103
|
-
}
|
|
104
|
-
|
|
105
82
|
/* Подъём под указателем — ручка для потребителя, как тень покоя; по умолчанию равен
|
|
106
83
|
тени покоя, и кнопка без подъёма под указателем не меняется. */
|
|
107
84
|
&:hover:not(:disabled) {
|
|
@@ -212,6 +189,9 @@
|
|
|
212
189
|
pointer-events: none;
|
|
213
190
|
}
|
|
214
191
|
}
|
|
192
|
+
|
|
193
|
+
/* Шаг входа `radius` переназначает собственное свойство кнопки. */
|
|
194
|
+
@include kv.radius-steps('--rt-icon-button-radius', '> .rt-icon-button');
|
|
215
195
|
}
|
|
216
196
|
|
|
217
197
|
@keyframes rt-icon-button-spin {
|
|
@@ -1,5 +1,8 @@
|
|
|
1
|
+
@use '../../../styles/mixins' as kv;
|
|
2
|
+
|
|
1
3
|
@layer rt-kit.components {
|
|
2
4
|
.rt-input {
|
|
5
|
+
--rt-input-box-radius: var(--rt-input-radius);
|
|
3
6
|
--rt-input-fill-radius: var(--rt-radius-sm);
|
|
4
7
|
--rt-input-toggle-radius: var(--rt-radius-sm);
|
|
5
8
|
|
|
@@ -11,7 +14,7 @@
|
|
|
11
14
|
align-items: center;
|
|
12
15
|
padding: var(--rt-input-padding-y) var(--rt-input-padding-x);
|
|
13
16
|
border: var(--rt-input-border-width) solid var(--rt-input-color-border);
|
|
14
|
-
border-radius: var(--rt-input-radius);
|
|
17
|
+
border-radius: var(--rt-input-box-radius);
|
|
15
18
|
background-color: var(--rt-input-color-bg);
|
|
16
19
|
color: var(--rt-input-color-text);
|
|
17
20
|
cursor: text;
|
|
@@ -144,5 +147,8 @@
|
|
|
144
147
|
outline-offset: var(--rt-input-focus-outline-offset);
|
|
145
148
|
}
|
|
146
149
|
}
|
|
150
|
+
|
|
151
|
+
/* Шаг входа `radius` переназначает скругление поля; панель в оверлее держит своё. */
|
|
152
|
+
@include kv.radius-steps('--rt-input-box-radius');
|
|
147
153
|
}
|
|
148
154
|
}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
|
+
@use '../../../styles/mixins' as kv;
|
|
2
|
+
|
|
1
3
|
@layer rt-kit.components {
|
|
2
4
|
.rt-input-number {
|
|
5
|
+
--rt-input-number-radius: var(--rt-input-radius);
|
|
3
6
|
--rt-input-number-fill-radius: var(--rt-radius-sm);
|
|
4
7
|
|
|
5
8
|
position: relative;
|
|
@@ -10,7 +13,7 @@
|
|
|
10
13
|
align-items: center;
|
|
11
14
|
padding: var(--rt-input-padding-y) var(--rt-input-padding-x);
|
|
12
15
|
border: var(--rt-input-border-width) solid var(--rt-input-color-border);
|
|
13
|
-
border-radius: var(--rt-input-radius);
|
|
16
|
+
border-radius: var(--rt-input-number-radius);
|
|
14
17
|
background-color: var(--rt-input-color-bg);
|
|
15
18
|
color: var(--rt-input-color-text);
|
|
16
19
|
cursor: text;
|
|
@@ -113,5 +116,8 @@
|
|
|
113
116
|
color: var(--rt-color-text-muted);
|
|
114
117
|
user-select: none;
|
|
115
118
|
}
|
|
119
|
+
|
|
120
|
+
/* Шаг входа `radius` переназначает скругление поля; панель в оверлее держит своё. */
|
|
121
|
+
@include kv.radius-steps('--rt-input-number-radius');
|
|
116
122
|
}
|
|
117
123
|
}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
@use '../../../styles/mixins' as kv;
|
|
2
|
+
|
|
1
3
|
@layer rt-kit.components {
|
|
2
4
|
.rt-markdown-text {
|
|
3
5
|
--rt-markdown-text-radius: var(--rt-radius-sm);
|
|
@@ -126,5 +128,8 @@
|
|
|
126
128
|
color: var(--rt-color-text-link);
|
|
127
129
|
text-decoration: underline;
|
|
128
130
|
}
|
|
131
|
+
|
|
132
|
+
/* Шаг входа `radius` переназначает скругление блоков кода. */
|
|
133
|
+
@include kv.radius-steps('--rt-markdown-text-radius');
|
|
129
134
|
}
|
|
130
135
|
}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
@use '../../../styles/mixins' as kv;
|
|
2
|
+
|
|
1
3
|
@layer rt-kit.components {
|
|
2
4
|
/* rt-menu-item — пункт меню rt-menu. ViewEncapsulation.None.
|
|
3
5
|
Host (`<rt-menu-item>`) несёт класс блока и сам является кликабельной зоной. */
|
|
@@ -87,5 +89,8 @@
|
|
|
87
89
|
background: transparent;
|
|
88
90
|
}
|
|
89
91
|
}
|
|
92
|
+
|
|
93
|
+
/* Шаг входа `radius` переназначает скругление пункта. */
|
|
94
|
+
@include kv.radius-steps('--rt-menu-item-radius');
|
|
90
95
|
}
|
|
91
96
|
}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
@use '../../../styles/mixins' as kv;
|
|
2
|
+
|
|
1
3
|
@layer rt-kit.components {
|
|
2
4
|
/* rt-message — alert/banner в common/ui. ViewEncapsulation.None.
|
|
3
5
|
Хост адресуется по имени элемента, а не по классу блока: класс `.rt-message` висит
|
|
@@ -61,5 +63,8 @@
|
|
|
61
63
|
margin-inline-start: auto;
|
|
62
64
|
}
|
|
63
65
|
}
|
|
66
|
+
|
|
67
|
+
/* Шаг входа `radius` переназначает скругление плашки. */
|
|
68
|
+
@include kv.radius-steps('--rt-message-radius', '> .rt-message');
|
|
64
69
|
}
|
|
65
70
|
}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
@use '../../../styles/mixins' as kv;
|
|
2
|
+
|
|
1
3
|
@layer rt-kit.components {
|
|
2
4
|
/* rt-money-list — финансовый блок на подложке (ViewEncapsulation.None).
|
|
3
5
|
Селектор bare `.rt-money-list` (класс на host). */
|
|
@@ -11,5 +13,8 @@
|
|
|
11
13
|
border-radius: var(--rt-money-list-radius);
|
|
12
14
|
background: var(--rt-color-bg-subtle);
|
|
13
15
|
gap: var(--rt-space-xs);
|
|
16
|
+
|
|
17
|
+
/* Шаг входа `radius` переназначает скругление списка. */
|
|
18
|
+
@include kv.radius-steps('--rt-money-list-radius');
|
|
14
19
|
}
|
|
15
20
|
}
|
|
@@ -8,11 +8,12 @@
|
|
|
8
8
|
|
|
9
9
|
Свои входы поверх общих из [`RtFormControlBase`](../form-control/CONTEXT.md):
|
|
10
10
|
|
|
11
|
-
| вход | тип
|
|
12
|
-
| ------------- |
|
|
13
|
-
| `options` | `ReadonlyArray<{ label, value, disabled? }>` (тот же тип, что у `rt-select`) | `[]` |
|
|
14
|
-
| `placeholder` | `string`
|
|
15
|
-
| `maxChips` | `number`
|
|
11
|
+
| вход | тип | умолчание |
|
|
12
|
+
| ------------- | --------------------------------------------------------------------------------------- | ----------------------- |
|
|
13
|
+
| `options` | `ReadonlyArray<{ label, value, disabled?, children? }>` (тот же тип, что у `rt-select`) | `[]` |
|
|
14
|
+
| `placeholder` | `string` | `''` → `uiSelectValues` |
|
|
15
|
+
| `maxChips` | `number` | `3` |
|
|
16
|
+
| `iconLeft` | `IRtIcon.Name \| null` (тот же вход, что у `rt-select`) | `null` |
|
|
16
17
|
|
|
17
18
|
Значение — `ReadonlyArray<TValue>`. Отдельного выхода выбора нет: значение едет только формой.
|
|
18
19
|
|
|
@@ -41,6 +42,12 @@
|
|
|
41
42
|
Как у [`rt-select`](../select/CONTEXT.md), с одним отличием: `Enter`/`Space` **переключают**
|
|
42
43
|
подсвеченную опцию, оставляя список открытым.
|
|
43
44
|
|
|
45
|
+
## Дерево опций
|
|
46
|
+
|
|
47
|
+
Опции с `children` рисуются деревом. Клик по ветке выбирает все её включённые листья или снимает
|
|
48
|
+
их, если выбраны все; значение самой ветки в выбор не пишется. Флажок ветки выводится из листьев:
|
|
49
|
+
включён, промежуточный или выключен. Договорённость — `docs/specs/ui-kit-v2/option-tree/`.
|
|
50
|
+
|
|
44
51
|
## Рядом
|
|
45
52
|
|
|
46
53
|
- [`rt-select`](../select/CONTEXT.md) — одно значение.
|