@rt-tools/ui-kit-v2 0.5.0 → 0.7.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 +87 -7
- package/fesm2022/rt-tools-ui-kit-v2.mjs +1929 -994
- package/fesm2022/rt-tools-ui-kit-v2.mjs.map +1 -1
- package/package.json +1 -1
- package/rt-tools-ui-kit-v2-0.7.0.tgz +0 -0
- package/src/lib/components/aside/_rt-aside-overlay.scss +73 -71
- package/src/lib/components/aside/footer/rt-aside-footer.component.scss +20 -16
- package/src/lib/components/aside/header/rt-aside-header.component.scss +72 -70
- package/src/lib/components/aside/rt-aside.component.scss +107 -105
- package/src/lib/components/aside/unsaved-dialog/rt-aside-unsaved-dialog.component.scss +33 -31
- package/src/lib/components/aside-section/rt-aside-section.component.scss +27 -23
- package/src/lib/components/autocomplete/rt-autocomplete.component.scss +124 -118
- package/src/lib/components/bar-list/rt-bar-list.component.scss +85 -81
- package/src/lib/components/bottom-sheet/rt-bottom-sheet.component.scss +64 -57
- package/src/lib/components/button/rt-button.directive.scss +319 -280
- package/src/lib/components/calendar/rt-calendar.component.scss +106 -102
- package/src/lib/components/card/rt-card.component.scss +53 -45
- package/src/lib/components/chat/rt-chat.component.scss +312 -306
- package/src/lib/components/checkbox/rt-checkbox.component.scss +61 -54
- package/src/lib/components/collapsible-text/rt-collapsible-text.component.scss +36 -34
- package/src/lib/components/confirm-popover/rt-confirm-popover.component.scss +36 -30
- package/src/lib/components/container/rt-container.component.scss +91 -87
- package/src/lib/components/counter/rt-counter.component.scss +14 -12
- package/src/lib/components/counter-row/rt-counter-row.component.scss +31 -27
- package/src/lib/components/date-picker/rt-date-picker.component.scss +73 -71
- package/src/lib/components/delta-view/rt-delta-view.component.scss +27 -25
- package/src/lib/components/detail-list/rt-detail-list.component.scss +8 -6
- package/src/lib/components/detail-list/rt-detail-row.component.scss +18 -16
- package/src/lib/components/dialog/footer/rt-dialog-footer.component.scss +19 -17
- package/src/lib/components/dialog/header/rt-dialog-header.component.scss +27 -25
- package/src/lib/components/dialog/rt-dialog.component.scss +59 -56
- package/src/lib/components/download-link/rt-download-link.component.scss +32 -27
- package/src/lib/components/empty-state/rt-empty-state.component.scss +50 -46
- package/src/lib/components/field/rt-field.component.scss +63 -61
- package/src/lib/components/file-card/rt-file-card.component.scss +84 -78
- package/src/lib/components/file-drop/rt-file-drop.component.scss +83 -77
- package/src/lib/components/file-input/rt-file-input.component.scss +20 -18
- package/src/lib/components/file-list/rt-file-list.component.scss +9 -7
- package/src/lib/components/filter-control/rt-filter-control.component.scss +16 -14
- package/src/lib/components/header/rt-header.component.scss +61 -55
- package/src/lib/components/icon/CONTEXT.md +16 -10
- package/src/lib/components/icon/rt-icon.component.scss +14 -12
- package/src/lib/components/icon-button/CONTEXT.md +4 -2
- package/src/lib/components/icon-button/rt-icon-button.component.scss +128 -112
- package/src/lib/components/info-item/rt-info-item.component.scss +38 -36
- package/src/lib/components/input/CONTEXT.md +9 -7
- package/src/lib/components/input/rt-input.component.scss +102 -98
- package/src/lib/components/input-number/rt-input-number.component.scss +84 -82
- package/src/lib/components/live-badge/rt-live-badge.component.scss +27 -23
- package/src/lib/components/logo/rt-logo.component.scss +54 -52
- package/src/lib/components/markdown-text/CONTEXT.md +40 -0
- package/src/lib/components/markdown-text/rt-markdown-text.component.scss +130 -0
- package/src/lib/components/menu/rt-menu-confirm-dialog.component.scss +30 -28
- package/src/lib/components/menu/rt-menu-item.component.scss +47 -42
- package/src/lib/components/menu/rt-menu.component.scss +23 -15
- package/src/lib/components/message/rt-message.component.scss +53 -49
- package/src/lib/components/message-composer/CONTEXT.md +1 -1
- package/src/lib/components/message-composer/rt-message-composer.component.scss +55 -49
- package/src/lib/components/money-list/rt-money-list.component.scss +13 -9
- package/src/lib/components/money-list/rt-money-row.component.scss +23 -19
- package/src/lib/components/multiselect/rt-multiselect.component.scss +169 -161
- package/src/lib/components/night-grid/rt-night-grid.component.scss +47 -42
- package/src/lib/components/note/rt-note.component.scss +15 -11
- package/src/lib/components/notifications-bell/rt-notifications-bell.component.scss +34 -27
- package/src/lib/components/page-header/rt-page-header-mobile.scss +142 -134
- package/src/lib/components/page-header/rt-page-header-submenu.scss +130 -123
- package/src/lib/components/page-header/rt-page-header.component.scss +221 -210
- package/src/lib/components/pagination/rt-pagination.component.scss +88 -81
- package/src/lib/components/photo-viewer/rt-photo-viewer.component.scss +109 -105
- package/src/lib/components/rich-editor/CONTEXT.md +1 -1
- package/src/lib/components/rich-editor/rt-rich-editor.component.scss +63 -59
- package/src/lib/components/section-nav/rt-section-nav.component.scss +53 -47
- package/src/lib/components/select/rt-select.component.scss +146 -138
- package/src/lib/components/skeleton/rt-skeleton.component.scss +50 -41
- package/src/lib/components/skeleton-wrapper/rt-skeleton-wrapper.component.scss +8 -6
- package/src/lib/components/spinner/rt-spinner.component.scss +35 -32
- package/src/lib/components/split-button/rt-split-button.component.scss +74 -62
- package/src/lib/components/stat-tile/rt-stat-tile.component.scss +95 -91
- package/src/lib/components/stepper/rt-stepper.component.scss +107 -101
- package/src/lib/components/table/copy-cell/rt-copy-cell.component.scss +39 -30
- package/src/lib/components/table/rt-table.component.scss +260 -252
- package/src/lib/components/table/settings-aside/rt-table-settings-aside.component.scss +7 -5
- package/src/lib/components/table/settings-panel/rt-table-settings-panel.component.scss +71 -61
- package/src/lib/components/table/sort-header/rt-table-sort-header.component.scss +31 -29
- package/src/lib/components/tabs/rt-tabs.component.scss +184 -175
- package/src/lib/components/tag/rt-tag.component.scss +97 -92
- package/src/lib/components/textarea/rt-textarea.component.scss +62 -60
- package/src/lib/components/theme-toggle/rt-theme-toggle.component.scss +7 -5
- package/src/lib/components/thread-list/rt-thread-list.component.scss +221 -212
- package/src/lib/components/timeline/rt-timeline.component.scss +82 -76
- package/src/lib/components/toast/rt-toast.component.scss +169 -160
- package/src/lib/components/toast/rt-toaster.component.scss +37 -35
- package/src/lib/components/toggle-button-group/rt-toggle-button-group.component.scss +129 -122
- package/src/lib/components/toggle-switch/rt-toggle-switch.component.scss +97 -91
- package/src/lib/components/toolbar/rt-toolbar.component.scss +63 -54
- package/src/lib/components/tooltip/rt-tooltip.component.scss +24 -15
- package/src/lib/components/welcome-dialog/rt-welcome-dialog.component.scss +46 -44
- package/src/lib/components/workspace/rt-workspace.component.scss +139 -131
- package/src/lib/components/workspace-details/rt-workspace-details.component.scss +105 -101
- package/src/styles/_index.scss +11 -0
- package/src/styles/_layers.scss +22 -0
- package/src/styles/_login.scss +87 -85
- package/src/styles/_mixins.scss +1 -1
- package/src/styles/_primitives.scss +138 -66
- package/src/styles/_scrollbar.scss +21 -19
- package/src/styles/_semantic.scss +155 -62
- package/src/styles/_theme-dark-rules.scss +23 -0
- package/src/styles/_theme-dark.scss +61 -42
- package/styles/tokens.css +754 -418
- package/types/rt-tools-ui-kit-v2.d.ts +292 -103
- package/rt-tools-ui-kit-v2-0.5.0.tgz +0 -0
package/package.json
CHANGED
|
Binary file
|
|
@@ -1,88 +1,90 @@
|
|
|
1
|
-
|
|
1
|
+
@layer rt-kit.components {
|
|
2
|
+
/* Панель и backdrop CDK Overlay, в котором живёт rt-aside.
|
|
2
3
|
|
|
3
|
-
|
|
4
|
-
|
|
4
|
+
Оверлей-контейнер CDK — sibling от <body>, поэтому эти правила глобальны по
|
|
5
|
+
природе: инкапсуляции здесь нет ни при какой настройке компонента.
|
|
5
6
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
Овладеть ими может не только сам rt-aside: rt-container держит ту же панель в
|
|
8
|
+
persistent-режиме и должен рисовать её, даже когда rt-aside в сборку не попал.
|
|
9
|
+
Поэтому правила вынесены сюда и подключаются обоими — один текст, один набор
|
|
10
|
+
значений, и разойтись им негде. */
|
|
10
11
|
|
|
11
|
-
/* Backdrop / длительность анимации — переопределяемые CSS-properties. */
|
|
12
|
-
:root {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
}
|
|
12
|
+
/* Backdrop / длительность анимации — переопределяемые CSS-properties. */
|
|
13
|
+
:root {
|
|
14
|
+
--rt-aside-animation-duration: 200ms;
|
|
15
|
+
--rt-aside-backdrop-bg: var(--rt-color-bg-overlay);
|
|
16
|
+
--rt-aside-backdrop-blur: 5px;
|
|
17
|
+
}
|
|
17
18
|
|
|
18
|
-
/* Двойной селектор `.cdk-overlay-backdrop.rt-aside-backdrop` нужен для specificity:
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
.cdk-overlay-backdrop.rt-aside-backdrop {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
19
|
+
/* Двойной селектор `.cdk-overlay-backdrop.rt-aside-backdrop` нужен для specificity:
|
|
20
|
+
CDK Overlay добавляет `.cdk-overlay-backdrop-showing { opacity: 1 }` сразу при attach;
|
|
21
|
+
при persistent overlay (rt-container auto-attach) backdrop должен оставаться скрытым
|
|
22
|
+
пока aside не открыт. Два класса (.cdk-overlay-backdrop + .rt-aside-backdrop) — выше
|
|
23
|
+
specificity чем одиночный (.cdk-overlay-backdrop-showing), поэтому наш opacity:0
|
|
24
|
+
побеждает. */
|
|
25
|
+
.cdk-overlay-backdrop.rt-aside-backdrop {
|
|
26
|
+
/* stylelint-disable-next-line property-no-vendor-prefix -- Safari < 18 */
|
|
27
|
+
-webkit-backdrop-filter: blur(var(--rt-aside-backdrop-blur));
|
|
28
|
+
backdrop-filter: blur(var(--rt-aside-backdrop-blur));
|
|
29
|
+
background: var(--rt-aside-backdrop-bg);
|
|
30
|
+
opacity: 0;
|
|
31
|
+
pointer-events: none;
|
|
32
|
+
transition: opacity var(--rt-aside-animation-duration) ease;
|
|
32
33
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
34
|
+
&.rt-aside-backdrop--visible {
|
|
35
|
+
opacity: 1;
|
|
36
|
+
pointer-events: auto;
|
|
37
|
+
}
|
|
36
38
|
}
|
|
37
|
-
}
|
|
38
39
|
|
|
39
|
-
.rt-aside-overlay {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
}
|
|
40
|
+
.rt-aside-overlay {
|
|
41
|
+
height: 100dvh;
|
|
42
|
+
transition: transform var(--rt-aside-animation-duration) ease;
|
|
43
|
+
}
|
|
43
44
|
|
|
44
|
-
/* Закрытая панель нажатий не ловит. На узком экране она шириной во весь вьюпорт,
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
.rt-aside-overlay:not(.rt-aside-overlay--open) {
|
|
50
|
-
|
|
51
|
-
}
|
|
45
|
+
/* Закрытая панель нажатий не ловит. На узком экране она шириной во весь вьюпорт,
|
|
46
|
+
и пока её сдвиг за край экрана не досчитан, она перекрывает страницу целиком:
|
|
47
|
+
выглядит это нормально, а нажатия уходят в пустоту. Селектор из двух классов —
|
|
48
|
+
чтобы правило не зависело от порядка, в котором браузер получил стили панели и
|
|
49
|
+
стили контейнера. */
|
|
50
|
+
.rt-aside-overlay:not(.rt-aside-overlay--open) {
|
|
51
|
+
pointer-events: none;
|
|
52
|
+
}
|
|
52
53
|
|
|
53
|
-
/* Стартовое положение за краем экрана не анимируется: переход из него начинается,
|
|
54
|
-
|
|
55
|
-
.rt-aside-overlay.rt-aside-overlay--entering {
|
|
56
|
-
|
|
57
|
-
}
|
|
54
|
+
/* Стартовое положение за краем экрана не анимируется: переход из него начинается,
|
|
55
|
+
как только вьюпорт задаёт панели ширину, и всю анимацию держит панель на месте. */
|
|
56
|
+
.rt-aside-overlay.rt-aside-overlay--entering {
|
|
57
|
+
transition: none;
|
|
58
|
+
}
|
|
58
59
|
|
|
59
|
-
/* Slide-in / slide-out states — переключаются сервисом через Renderer2 на host.
|
|
60
|
-
|
|
61
|
-
.rt-aside-overlay--position-right.rt-aside-overlay--entering,
|
|
62
|
-
.rt-aside-overlay--position-right.rt-aside-overlay--leaving {
|
|
63
|
-
|
|
64
|
-
}
|
|
60
|
+
/* Slide-in / slide-out states — переключаются сервисом через Renderer2 на host.
|
|
61
|
+
--entering: initial off-screen position; --open: in place; --leaving: off-screen exit. */
|
|
62
|
+
.rt-aside-overlay--position-right.rt-aside-overlay--entering,
|
|
63
|
+
.rt-aside-overlay--position-right.rt-aside-overlay--leaving {
|
|
64
|
+
transform: translateX(100%);
|
|
65
|
+
}
|
|
65
66
|
|
|
66
|
-
.rt-aside-overlay--position-left.rt-aside-overlay--entering,
|
|
67
|
-
.rt-aside-overlay--position-left.rt-aside-overlay--leaving {
|
|
68
|
-
|
|
69
|
-
}
|
|
67
|
+
.rt-aside-overlay--position-left.rt-aside-overlay--entering,
|
|
68
|
+
.rt-aside-overlay--position-left.rt-aside-overlay--leaving {
|
|
69
|
+
transform: translateX(-100%);
|
|
70
|
+
}
|
|
70
71
|
|
|
71
|
-
.rt-aside-overlay--position-right.rt-aside-overlay--open,
|
|
72
|
-
.rt-aside-overlay--position-left.rt-aside-overlay--open {
|
|
73
|
-
|
|
74
|
-
}
|
|
72
|
+
.rt-aside-overlay--position-right.rt-aside-overlay--open,
|
|
73
|
+
.rt-aside-overlay--position-left.rt-aside-overlay--open {
|
|
74
|
+
transform: translateX(0);
|
|
75
|
+
}
|
|
75
76
|
|
|
76
|
-
@media (width <= 768px) {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
77
|
+
@media (width <= 768px) {
|
|
78
|
+
.rt-aside-overlay {
|
|
79
|
+
overflow: hidden;
|
|
80
|
+
width: 100dvw;
|
|
81
|
+
max-width: 100dvw;
|
|
82
|
+
}
|
|
81
83
|
}
|
|
82
|
-
}
|
|
83
84
|
|
|
84
|
-
@media (prefers-reduced-motion: reduce) {
|
|
85
|
-
|
|
86
|
-
|
|
85
|
+
@media (prefers-reduced-motion: reduce) {
|
|
86
|
+
.rt-aside-overlay {
|
|
87
|
+
transition: none;
|
|
88
|
+
}
|
|
87
89
|
}
|
|
88
90
|
}
|
|
@@ -1,22 +1,26 @@
|
|
|
1
|
-
|
|
1
|
+
@layer rt-kit.components {
|
|
2
|
+
/* rt-aside-footer — footer-слот side-sheet'а. ViewEncapsulation.None. */
|
|
2
3
|
|
|
3
|
-
.rt-aside-footer {
|
|
4
|
-
|
|
4
|
+
.rt-aside-footer {
|
|
5
|
+
--rt-aside-footer-border-width: var(--rt-border-width-thin);
|
|
5
6
|
|
|
6
|
-
|
|
7
|
-
горизонтали на тот же инсет, что и контентная зона, поэтому
|
|
8
|
-
border-block-start совпадает по краям с контентом. */
|
|
9
|
-
margin: var(--rt-aside-inset);
|
|
10
|
-
border-block-start: var(--rt-border-width-thin) solid var(--rt-color-border-subtle);
|
|
7
|
+
padding-top: var(--rt-aside-inset);
|
|
11
8
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
9
|
+
/* Верхний разделитель не на всю ширину панели: margin отбивает футер по
|
|
10
|
+
горизонтали на тот же инсет, что и контентная зона, поэтому
|
|
11
|
+
border-block-start совпадает по краям с контентом. */
|
|
12
|
+
margin: var(--rt-aside-inset);
|
|
13
|
+
border-block-start: var(--rt-aside-footer-border-width) solid var(--rt-color-border-subtle);
|
|
14
|
+
|
|
15
|
+
&__content {
|
|
16
|
+
display: flex;
|
|
17
|
+
flex-wrap: wrap;
|
|
18
|
+
justify-content: space-between;
|
|
19
|
+
gap: var(--rt-space-sm);
|
|
20
|
+
}
|
|
18
21
|
|
|
19
|
-
|
|
20
|
-
|
|
22
|
+
&:empty {
|
|
23
|
+
display: none;
|
|
24
|
+
}
|
|
21
25
|
}
|
|
22
26
|
}
|
|
@@ -1,88 +1,90 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
@layer rt-kit.components {
|
|
2
|
+
/* rt-aside-header — заголовок side-sheet'а. ViewEncapsulation.None.
|
|
3
|
+
Селекторы префиксованы `.rt-aside-header`. */
|
|
3
4
|
|
|
4
|
-
.rt-aside-header {
|
|
5
|
-
|
|
5
|
+
.rt-aside-header {
|
|
6
|
+
padding: var(--rt-aside-inset);
|
|
6
7
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
&__back {
|
|
15
|
-
flex-shrink: 0;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
/* Колонка overline + title. flex/min-width живут здесь, чтобы ellipsis
|
|
19
|
-
у title работал и в двухстрочном варианте. */
|
|
20
|
-
&__heading {
|
|
21
|
-
display: flex;
|
|
22
|
-
min-width: 0;
|
|
23
|
-
flex: 1 1 auto;
|
|
24
|
-
flex-direction: column;
|
|
25
|
-
gap: var(--rt-space-0-5);
|
|
26
|
-
}
|
|
8
|
+
&__content {
|
|
9
|
+
display: flex;
|
|
10
|
+
min-width: 0;
|
|
11
|
+
align-items: center;
|
|
12
|
+
gap: var(--rt-space-sm);
|
|
13
|
+
}
|
|
27
14
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
color: var(--rt-color-text-muted);
|
|
32
|
-
font-size: var(--rt-text-xs);
|
|
33
|
-
line-height: var(--rt-leading-snug);
|
|
34
|
-
text-overflow: ellipsis;
|
|
35
|
-
white-space: nowrap;
|
|
36
|
-
}
|
|
15
|
+
&__back {
|
|
16
|
+
flex-shrink: 0;
|
|
17
|
+
}
|
|
37
18
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
19
|
+
/* Колонка overline + title. flex/min-width живут здесь, чтобы ellipsis
|
|
20
|
+
у title работал и в двухстрочном варианте. */
|
|
21
|
+
&__heading {
|
|
22
|
+
display: flex;
|
|
23
|
+
min-width: 0;
|
|
24
|
+
flex: 1 1 auto;
|
|
25
|
+
flex-direction: column;
|
|
26
|
+
gap: var(--rt-space-0-5);
|
|
27
|
+
}
|
|
44
28
|
|
|
45
|
-
|
|
46
|
-
как ng-content внутри inline-flex; чтобы `text-overflow: ellipsis`
|
|
47
|
-
cработал, нужен block-level контейнер с overflow: hidden над текстом. */
|
|
48
|
-
> rt-skeleton-wrapper {
|
|
49
|
-
display: block;
|
|
29
|
+
&__overline {
|
|
50
30
|
overflow: hidden;
|
|
51
|
-
|
|
31
|
+
margin: 0;
|
|
32
|
+
color: var(--rt-color-text-muted);
|
|
33
|
+
font-size: var(--rt-text-xs);
|
|
34
|
+
line-height: var(--rt-leading-snug);
|
|
52
35
|
text-overflow: ellipsis;
|
|
53
36
|
white-space: nowrap;
|
|
54
37
|
}
|
|
55
|
-
}
|
|
56
38
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
}
|
|
39
|
+
&__title {
|
|
40
|
+
overflow: hidden;
|
|
41
|
+
min-width: 0;
|
|
42
|
+
margin: 0;
|
|
43
|
+
color: var(--rt-color-text-primary);
|
|
44
|
+
font-size: var(--rt-text-xl);
|
|
64
45
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
46
|
+
/* Ellipsis для длинного заголовка: skeleton-wrapper рендерит `{{ title }}`
|
|
47
|
+
как ng-content внутри inline-flex; чтобы `text-overflow: ellipsis`
|
|
48
|
+
cработал, нужен block-level контейнер с overflow: hidden над текстом. */
|
|
49
|
+
> rt-skeleton-wrapper {
|
|
50
|
+
display: block;
|
|
51
|
+
overflow: hidden;
|
|
52
|
+
min-width: 0;
|
|
53
|
+
text-overflow: ellipsis;
|
|
54
|
+
white-space: nowrap;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
70
57
|
|
|
71
|
-
|
|
72
|
-
|
|
58
|
+
/* Ряд бэйджей под title — переносится на новую строку при нехватке ширины. */
|
|
59
|
+
&__badges {
|
|
60
|
+
display: flex;
|
|
61
|
+
flex-wrap: wrap;
|
|
62
|
+
margin-top: var(--rt-space-1);
|
|
63
|
+
gap: var(--rt-space-xs);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/* Бэйдж-ссылка: тег в роли якоря (открывает тур в новой вкладке). */
|
|
67
|
+
&__badge-link {
|
|
68
|
+
display: inline-flex;
|
|
69
|
+
cursor: pointer;
|
|
70
|
+
text-decoration: none;
|
|
71
|
+
|
|
72
|
+
&:hover {
|
|
73
|
+
opacity: 0.85;
|
|
74
|
+
}
|
|
73
75
|
}
|
|
74
|
-
}
|
|
75
76
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
77
|
+
/* Ряд action-иконок справа от title (отклонить / на доработку / снять с
|
|
78
|
+
публикации и т.п.). Пустой при отсутствии проекции — нулевой ширины. */
|
|
79
|
+
&__actions {
|
|
80
|
+
display: flex;
|
|
81
|
+
flex-shrink: 0;
|
|
82
|
+
align-items: center;
|
|
83
|
+
gap: var(--rt-space-xs);
|
|
83
84
|
|
|
84
|
-
|
|
85
|
-
|
|
85
|
+
&:empty {
|
|
86
|
+
display: none;
|
|
87
|
+
}
|
|
86
88
|
}
|
|
87
89
|
}
|
|
88
90
|
}
|
|
@@ -7,127 +7,129 @@
|
|
|
7
7
|
|
|
8
8
|
@use './rt-aside-overlay';
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
/* Хост адресуется по имени элемента, а не по классу блока: класс `.rt-aside`
|
|
25
|
-
висит и на `<rt-aside>`, и на рамке внутри него, поэтому правила рамки
|
|
26
|
-
вложены в хост. Сам хост боксом не становится: рамка должна быть прямым
|
|
27
|
-
flex-ребёнком overlay-панели. */
|
|
28
|
-
rt-aside {
|
|
29
|
-
display: contents;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
rt-aside .rt-aside {
|
|
33
|
-
display: flex;
|
|
34
|
-
width: var(--rt-aside-width, var(--rt-aside-width-md));
|
|
35
|
-
|
|
36
|
-
/* rt-aside — flex-child cdk-overlay-pane. Default `min-width: auto` у flex-item
|
|
37
|
-
заставляет ширину расти до max-content вложенного контента (длинный
|
|
38
|
-
заголовок без переносов раздул бы panel за пределы viewport). 0 — let
|
|
39
|
-
cross-axis размера контейнера ограничивать, а ellipsis в title клипает текст. */
|
|
40
|
-
min-width: 0;
|
|
41
|
-
max-width: 100%;
|
|
42
|
-
height: 100%;
|
|
43
|
-
flex-direction: column;
|
|
44
|
-
padding: 0;
|
|
45
|
-
border: none;
|
|
46
|
-
background: var(--rt-color-bg-surface);
|
|
47
|
-
color: var(--rt-color-text-primary);
|
|
48
|
-
|
|
49
|
-
/* Header / footer всегда видны, контентная часть скроллится при overflow.
|
|
50
|
-
Селекторы по тегам — `<rt-aside-header>` / `<rt-aside-footer>` это
|
|
51
|
-
Angular host-элементы, у которых нет класса `.rt-aside-header`
|
|
52
|
-
(этот класс висит на вложенном `<header>` / `<footer>` внутри них).
|
|
53
|
-
`min-height: 0` обязателен — без него flex item не сможет shrink ниже
|
|
54
|
-
intrinsic content size и overflow-y не сработает. */
|
|
55
|
-
& > rt-aside-header,
|
|
56
|
-
& > rt-aside-footer {
|
|
57
|
-
/* min-width: 0 пробрасывается флекс-детям вниз — без него заголовок с
|
|
58
|
-
неразрывным длинным текстом раздувает header/footer шире
|
|
59
|
-
cross-axis-размера контейнера и выходит за viewport. */
|
|
60
|
-
min-width: 0;
|
|
61
|
-
flex-shrink: 0;
|
|
10
|
+
@layer rt-kit.components {
|
|
11
|
+
/* Size tokens — sm/md/lg (aside уже модалки чем rt-dialog). */
|
|
12
|
+
:root {
|
|
13
|
+
--rt-aside-width-sm: 400px;
|
|
14
|
+
--rt-aside-width-md: 540px;
|
|
15
|
+
--rt-aside-width-lg: 720px;
|
|
16
|
+
|
|
17
|
+
/* Инсет панели: шапка, содержимое и футер отбиты от края одним и тем же
|
|
18
|
+
значением, поэтому поля во всех панелях одной ширины. */
|
|
19
|
+
--rt-aside-inset: var(--rt-space-lg);
|
|
20
|
+
|
|
21
|
+
/* Ритм между корневыми блоками содержимого. */
|
|
22
|
+
--rt-aside-content-gap: var(--rt-space-md);
|
|
62
23
|
}
|
|
63
24
|
|
|
64
|
-
/*
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
min-height: 0;
|
|
71
|
-
flex: 1 1 auto;
|
|
72
|
-
flex-direction: column;
|
|
73
|
-
padding: var(--rt-aside-inset);
|
|
74
|
-
gap: var(--rt-aside-content-gap);
|
|
75
|
-
overflow-y: auto;
|
|
76
|
-
overscroll-behavior: contain;
|
|
25
|
+
/* Хост адресуется по имени элемента, а не по классу блока: класс `.rt-aside`
|
|
26
|
+
висит и на `<rt-aside>`, и на рамке внутри него, поэтому правила рамки
|
|
27
|
+
вложены в хост. Сам хост боксом не становится: рамка должна быть прямым
|
|
28
|
+
flex-ребёнком overlay-панели. */
|
|
29
|
+
rt-aside {
|
|
30
|
+
display: contents;
|
|
77
31
|
}
|
|
78
32
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
&--size--md {
|
|
33
|
+
rt-aside .rt-aside {
|
|
34
|
+
display: flex;
|
|
84
35
|
width: var(--rt-aside-width, var(--rt-aside-width-md));
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
&--size--lg {
|
|
88
|
-
width: var(--rt-aside-width, var(--rt-aside-width-lg));
|
|
89
|
-
}
|
|
90
36
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
37
|
+
/* rt-aside — flex-child cdk-overlay-pane. Default `min-width: auto` у flex-item
|
|
38
|
+
заставляет ширину расти до max-content вложенного контента (длинный
|
|
39
|
+
заголовок без переносов раздул бы panel за пределы viewport). 0 — let
|
|
40
|
+
cross-axis размера контейнера ограничивать, а ellipsis в title клипает текст. */
|
|
41
|
+
min-width: 0;
|
|
42
|
+
max-width: 100%;
|
|
43
|
+
height: 100%;
|
|
44
|
+
flex-direction: column;
|
|
45
|
+
padding: 0;
|
|
46
|
+
border: none;
|
|
47
|
+
background: var(--rt-color-bg-surface);
|
|
48
|
+
color: var(--rt-color-text-primary);
|
|
49
|
+
|
|
50
|
+
/* Header / footer всегда видны, контентная часть скроллится при overflow.
|
|
51
|
+
Селекторы по тегам — `<rt-aside-header>` / `<rt-aside-footer>` это
|
|
52
|
+
Angular host-элементы, у которых нет класса `.rt-aside-header`
|
|
53
|
+
(этот класс висит на вложенном `<header>` / `<footer>` внутри них).
|
|
54
|
+
`min-height: 0` обязателен — без него flex item не сможет shrink ниже
|
|
55
|
+
intrinsic content size и overflow-y не сработает. */
|
|
56
|
+
& > rt-aside-header,
|
|
57
|
+
& > rt-aside-footer {
|
|
58
|
+
/* min-width: 0 пробрасывается флекс-детям вниз — без него заголовок с
|
|
59
|
+
неразрывным длинным текстом раздувает header/footer шире
|
|
60
|
+
cross-axis-размера контейнера и выходит за viewport. */
|
|
61
|
+
min-width: 0;
|
|
62
|
+
flex-shrink: 0;
|
|
100
63
|
}
|
|
101
64
|
|
|
102
|
-
/*
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
65
|
+
/* Единственная зона содержимого: она держит инсет панели и она же
|
|
66
|
+
прокручивается. Отступы живут здесь, а не в потребителях — иначе каждая
|
|
67
|
+
панель помнит про них сама, и поля получают разную ширину. */
|
|
68
|
+
&__content {
|
|
69
|
+
display: flex;
|
|
70
|
+
min-width: 0;
|
|
107
71
|
min-height: 0;
|
|
108
72
|
flex: 1 1 auto;
|
|
109
|
-
|
|
73
|
+
flex-direction: column;
|
|
74
|
+
padding: var(--rt-aside-inset);
|
|
75
|
+
gap: var(--rt-aside-content-gap);
|
|
76
|
+
overflow-y: auto;
|
|
77
|
+
overscroll-behavior: contain;
|
|
110
78
|
}
|
|
111
79
|
|
|
112
|
-
|
|
113
|
-
|
|
80
|
+
&--size--sm {
|
|
81
|
+
width: var(--rt-aside-width, var(--rt-aside-width-sm));
|
|
114
82
|
}
|
|
115
83
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
84
|
+
&--size--md {
|
|
85
|
+
width: var(--rt-aside-width, var(--rt-aside-width-md));
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
&--size--lg {
|
|
89
|
+
width: var(--rt-aside-width, var(--rt-aside-width-lg));
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/* Контент — rt-tabs: скроллером становится контент активной вкладки, а не
|
|
93
|
+
контентная зона асайда, чтобы полоса вкладок оставалась прибитой. */
|
|
94
|
+
&--content--tabs {
|
|
95
|
+
/* Контентная зона больше не скроллер, но её горизонтальный инсет СОХРАНЯЕМ:
|
|
96
|
+
прямой контент вне rt-tabs (скелетоны загрузки, rt-message ошибки) должен
|
|
97
|
+
отступать от краёв как обычно. Снимаем только нижний отступ. */
|
|
98
|
+
.rt-aside__content {
|
|
99
|
+
overflow: hidden;
|
|
100
|
+
padding-block-end: 0;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/* rt-tabs растягивается на всю ширину панели (гасит инсет контентной зоны),
|
|
104
|
+
а инсет возвращается ВНУТРЬ полосы и скролл-контейнера. Так overflow
|
|
105
|
+
скролл-контейнера не режет focus-ring инпутов, прижатых к краю, а полоса
|
|
106
|
+
и контент остаются в коридоре --rt-aside-inset. */
|
|
107
|
+
rt-tabs {
|
|
108
|
+
min-height: 0;
|
|
109
|
+
flex: 1 1 auto;
|
|
110
|
+
margin-inline: calc(-1 * var(--rt-aside-inset));
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
.rt-tabs__header {
|
|
114
|
+
padding-inline: var(--rt-aside-inset);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
.rt-tabs__content {
|
|
118
|
+
/* Нижний отступ внутри скроллера — последний элемент не докручивается
|
|
119
|
+
вплотную к футеру. */
|
|
120
|
+
padding-bottom: var(--rt-aside-inset);
|
|
121
|
+
padding-inline: var(--rt-aside-inset);
|
|
122
|
+
}
|
|
121
123
|
}
|
|
122
124
|
}
|
|
123
|
-
}
|
|
124
125
|
|
|
125
|
-
@media (width <= 768px) {
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
126
|
+
@media (width <= 768px) {
|
|
127
|
+
rt-aside .rt-aside,
|
|
128
|
+
rt-aside .rt-aside--size--sm,
|
|
129
|
+
rt-aside .rt-aside--size--md,
|
|
130
|
+
rt-aside .rt-aside--size--lg {
|
|
131
|
+
width: 100dvw;
|
|
132
|
+
max-width: 100dvw;
|
|
133
|
+
}
|
|
132
134
|
}
|
|
133
135
|
}
|