@rt-tools/ui-kit-v2 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/README.md +71 -0
  2. package/fesm2022/rt-tools-ui-kit-v2.mjs +166 -166
  3. package/fesm2022/rt-tools-ui-kit-v2.mjs.map +1 -1
  4. package/package.json +1 -1
  5. package/rt-tools-ui-kit-v2-0.6.0.tgz +0 -0
  6. package/src/lib/components/aside/_rt-aside-overlay.scss +73 -71
  7. package/src/lib/components/aside/footer/rt-aside-footer.component.scss +20 -16
  8. package/src/lib/components/aside/header/rt-aside-header.component.scss +72 -70
  9. package/src/lib/components/aside/rt-aside.component.scss +107 -105
  10. package/src/lib/components/aside/unsaved-dialog/rt-aside-unsaved-dialog.component.scss +33 -31
  11. package/src/lib/components/aside-section/rt-aside-section.component.scss +27 -23
  12. package/src/lib/components/autocomplete/rt-autocomplete.component.scss +124 -118
  13. package/src/lib/components/bar-list/rt-bar-list.component.scss +85 -81
  14. package/src/lib/components/bottom-sheet/rt-bottom-sheet.component.scss +64 -57
  15. package/src/lib/components/button/rt-button.directive.scss +319 -280
  16. package/src/lib/components/calendar/rt-calendar.component.scss +106 -102
  17. package/src/lib/components/card/rt-card.component.scss +53 -45
  18. package/src/lib/components/chat/rt-chat.component.scss +312 -306
  19. package/src/lib/components/checkbox/rt-checkbox.component.scss +61 -54
  20. package/src/lib/components/collapsible-text/rt-collapsible-text.component.scss +36 -34
  21. package/src/lib/components/confirm-popover/rt-confirm-popover.component.scss +36 -30
  22. package/src/lib/components/container/rt-container.component.scss +91 -87
  23. package/src/lib/components/counter/rt-counter.component.scss +14 -12
  24. package/src/lib/components/counter-row/rt-counter-row.component.scss +31 -27
  25. package/src/lib/components/date-picker/rt-date-picker.component.scss +73 -71
  26. package/src/lib/components/delta-view/rt-delta-view.component.scss +27 -25
  27. package/src/lib/components/detail-list/rt-detail-list.component.scss +8 -6
  28. package/src/lib/components/detail-list/rt-detail-row.component.scss +18 -16
  29. package/src/lib/components/dialog/footer/rt-dialog-footer.component.scss +19 -17
  30. package/src/lib/components/dialog/header/rt-dialog-header.component.scss +27 -25
  31. package/src/lib/components/dialog/rt-dialog.component.scss +59 -56
  32. package/src/lib/components/download-link/rt-download-link.component.scss +32 -27
  33. package/src/lib/components/empty-state/rt-empty-state.component.scss +50 -46
  34. package/src/lib/components/field/rt-field.component.scss +63 -61
  35. package/src/lib/components/file-card/rt-file-card.component.scss +84 -78
  36. package/src/lib/components/file-drop/rt-file-drop.component.scss +83 -77
  37. package/src/lib/components/file-input/rt-file-input.component.scss +20 -18
  38. package/src/lib/components/file-list/rt-file-list.component.scss +9 -7
  39. package/src/lib/components/filter-control/rt-filter-control.component.scss +16 -14
  40. package/src/lib/components/header/rt-header.component.scss +61 -55
  41. package/src/lib/components/icon/rt-icon.component.scss +14 -12
  42. package/src/lib/components/icon-button/CONTEXT.md +4 -2
  43. package/src/lib/components/icon-button/rt-icon-button.component.scss +128 -112
  44. package/src/lib/components/info-item/rt-info-item.component.scss +38 -36
  45. package/src/lib/components/input/rt-input.component.scss +102 -98
  46. package/src/lib/components/input-number/rt-input-number.component.scss +84 -82
  47. package/src/lib/components/live-badge/rt-live-badge.component.scss +27 -23
  48. package/src/lib/components/logo/rt-logo.component.scss +54 -52
  49. package/src/lib/components/menu/rt-menu-confirm-dialog.component.scss +30 -28
  50. package/src/lib/components/menu/rt-menu-item.component.scss +47 -42
  51. package/src/lib/components/menu/rt-menu.component.scss +23 -15
  52. package/src/lib/components/message/rt-message.component.scss +53 -49
  53. package/src/lib/components/message-composer/rt-message-composer.component.scss +55 -49
  54. package/src/lib/components/money-list/rt-money-list.component.scss +13 -9
  55. package/src/lib/components/money-list/rt-money-row.component.scss +23 -19
  56. package/src/lib/components/multiselect/rt-multiselect.component.scss +169 -161
  57. package/src/lib/components/night-grid/rt-night-grid.component.scss +47 -42
  58. package/src/lib/components/note/rt-note.component.scss +15 -11
  59. package/src/lib/components/notifications-bell/rt-notifications-bell.component.scss +34 -27
  60. package/src/lib/components/page-header/rt-page-header-mobile.scss +142 -134
  61. package/src/lib/components/page-header/rt-page-header-submenu.scss +130 -123
  62. package/src/lib/components/page-header/rt-page-header.component.scss +221 -210
  63. package/src/lib/components/pagination/rt-pagination.component.scss +88 -81
  64. package/src/lib/components/photo-viewer/rt-photo-viewer.component.scss +109 -105
  65. package/src/lib/components/rich-editor/rt-rich-editor.component.scss +63 -59
  66. package/src/lib/components/section-nav/rt-section-nav.component.scss +53 -47
  67. package/src/lib/components/select/rt-select.component.scss +146 -138
  68. package/src/lib/components/skeleton/rt-skeleton.component.scss +50 -41
  69. package/src/lib/components/skeleton-wrapper/rt-skeleton-wrapper.component.scss +8 -6
  70. package/src/lib/components/spinner/rt-spinner.component.scss +35 -32
  71. package/src/lib/components/split-button/rt-split-button.component.scss +74 -62
  72. package/src/lib/components/stat-tile/rt-stat-tile.component.scss +95 -91
  73. package/src/lib/components/stepper/rt-stepper.component.scss +107 -101
  74. package/src/lib/components/table/copy-cell/rt-copy-cell.component.scss +34 -30
  75. package/src/lib/components/table/rt-table.component.scss +260 -252
  76. package/src/lib/components/table/settings-aside/rt-table-settings-aside.component.scss +7 -5
  77. package/src/lib/components/table/settings-panel/rt-table-settings-panel.component.scss +71 -61
  78. package/src/lib/components/table/sort-header/rt-table-sort-header.component.scss +31 -29
  79. package/src/lib/components/tabs/rt-tabs.component.scss +184 -175
  80. package/src/lib/components/tag/rt-tag.component.scss +97 -92
  81. package/src/lib/components/textarea/rt-textarea.component.scss +62 -60
  82. package/src/lib/components/theme-toggle/rt-theme-toggle.component.scss +7 -5
  83. package/src/lib/components/thread-list/rt-thread-list.component.scss +221 -212
  84. package/src/lib/components/timeline/rt-timeline.component.scss +82 -76
  85. package/src/lib/components/toast/rt-toast.component.scss +169 -160
  86. package/src/lib/components/toast/rt-toaster.component.scss +37 -35
  87. package/src/lib/components/toggle-button-group/rt-toggle-button-group.component.scss +129 -122
  88. package/src/lib/components/toggle-switch/rt-toggle-switch.component.scss +97 -91
  89. package/src/lib/components/toolbar/rt-toolbar.component.scss +56 -54
  90. package/src/lib/components/tooltip/rt-tooltip.component.scss +20 -15
  91. package/src/lib/components/welcome-dialog/rt-welcome-dialog.component.scss +46 -44
  92. package/src/lib/components/workspace/rt-workspace.component.scss +139 -131
  93. package/src/lib/components/workspace-details/rt-workspace-details.component.scss +105 -101
  94. package/src/styles/_index.scss +4 -0
  95. package/src/styles/_layers.scss +22 -0
  96. package/src/styles/_login.scss +87 -85
  97. package/src/styles/_mixins.scss +1 -1
  98. package/src/styles/_primitives.scss +126 -67
  99. package/src/styles/_scrollbar.scss +21 -19
  100. package/src/styles/_semantic.scss +140 -56
  101. package/src/styles/_theme-dark.scss +60 -27
  102. package/styles/tokens.css +628 -408
  103. package/rt-tools-ui-kit-v2-0.5.0.tgz +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rt-tools/ui-kit-v2",
3
- "version": "0.5.0",
3
+ "version": "0.6.0",
4
4
  "license": "Apache-2.0",
5
5
  "author": "Yauheni Krumin",
6
6
  "type": "module",
Binary file
@@ -1,88 +1,90 @@
1
- /* Панель и backdrop CDK Overlay, в котором живёт rt-aside.
1
+ @layer rt-kit.components {
2
+ /* Панель и backdrop CDK Overlay, в котором живёт rt-aside.
2
3
 
3
- Оверлей-контейнер CDK — sibling от <body>, поэтому эти правила глобальны по
4
- природе: инкапсуляции здесь нет ни при какой настройке компонента.
4
+ Оверлей-контейнер CDK — sibling от <body>, поэтому эти правила глобальны по
5
+ природе: инкапсуляции здесь нет ни при какой настройке компонента.
5
6
 
6
- Овладеть ими может не только сам rt-aside: rt-container держит ту же панель в
7
- persistent-режиме и должен рисовать её, даже когда rt-aside в сборку не попал.
8
- Поэтому правила вынесены сюда и подключаются обоими — один текст, один набор
9
- значений, и разойтись им негде. */
7
+ Овладеть ими может не только сам rt-aside: rt-container держит ту же панель в
8
+ persistent-режиме и должен рисовать её, даже когда rt-aside в сборку не попал.
9
+ Поэтому правила вынесены сюда и подключаются обоими — один текст, один набор
10
+ значений, и разойтись им негде. */
10
11
 
11
- /* Backdrop / длительность анимации — переопределяемые CSS-properties. */
12
- :root {
13
- --rt-aside-animation-duration: 200ms;
14
- --rt-aside-backdrop-bg: rgb(0 0 0 / 45%);
15
- --rt-aside-backdrop-blur: 5px;
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
- CDK Overlay добавляет `.cdk-overlay-backdrop-showing { opacity: 1 }` сразу при attach;
20
- при persistent overlay (rt-container auto-attach) backdrop должен оставаться скрытым
21
- пока aside не открыт. Два класса (.cdk-overlay-backdrop + .rt-aside-backdrop) — выше
22
- specificity чем одиночный (.cdk-overlay-backdrop-showing), поэтому наш opacity:0
23
- побеждает. */
24
- .cdk-overlay-backdrop.rt-aside-backdrop {
25
- /* stylelint-disable-next-line property-no-vendor-prefix -- Safari < 18 */
26
- -webkit-backdrop-filter: blur(var(--rt-aside-backdrop-blur));
27
- backdrop-filter: blur(var(--rt-aside-backdrop-blur));
28
- background: var(--rt-aside-backdrop-bg);
29
- opacity: 0;
30
- pointer-events: none;
31
- transition: opacity var(--rt-aside-animation-duration) ease;
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
- &.rt-aside-backdrop--visible {
34
- opacity: 1;
35
- pointer-events: auto;
34
+ &.rt-aside-backdrop--visible {
35
+ opacity: 1;
36
+ pointer-events: auto;
37
+ }
36
38
  }
37
- }
38
39
 
39
- .rt-aside-overlay {
40
- height: 100dvh;
41
- transition: transform var(--rt-aside-animation-duration) ease;
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
- pointer-events: none;
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
- transition: none;
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
- --entering: initial off-screen position; --open: in place; --leaving: off-screen exit. */
61
- .rt-aside-overlay--position-right.rt-aside-overlay--entering,
62
- .rt-aside-overlay--position-right.rt-aside-overlay--leaving {
63
- transform: translateX(100%);
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
- transform: translateX(-100%);
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
- transform: translateX(0);
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
- .rt-aside-overlay {
78
- overflow: hidden;
79
- width: 100dvw;
80
- max-width: 100dvw;
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
- .rt-aside-overlay {
86
- transition: none;
85
+ @media (prefers-reduced-motion: reduce) {
86
+ .rt-aside-overlay {
87
+ transition: none;
88
+ }
87
89
  }
88
90
  }
@@ -1,22 +1,26 @@
1
- /* rt-aside-footer — footer-слот side-sheet'а. ViewEncapsulation.None. */
1
+ @layer rt-kit.components {
2
+ /* rt-aside-footer — footer-слот side-sheet'а. ViewEncapsulation.None. */
2
3
 
3
- .rt-aside-footer {
4
- padding-top: var(--rt-aside-inset);
4
+ .rt-aside-footer {
5
+ --rt-aside-footer-border-width: var(--rt-border-width-thin);
5
6
 
6
- /* Верхний разделитель не на всю ширину панели: margin отбивает футер по
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
- &__content {
13
- display: flex;
14
- flex-wrap: wrap;
15
- justify-content: space-between;
16
- gap: var(--rt-space-sm);
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
- &:empty {
20
- display: none;
22
+ &:empty {
23
+ display: none;
24
+ }
21
25
  }
22
26
  }
@@ -1,88 +1,90 @@
1
- /* rt-aside-header — заголовок side-sheet'а. ViewEncapsulation.None.
2
- Селекторы префиксованы `.rt-aside-header`. */
1
+ @layer rt-kit.components {
2
+ /* rt-aside-header — заголовок side-sheet'а. ViewEncapsulation.None.
3
+ Селекторы префиксованы `.rt-aside-header`. */
3
4
 
4
- .rt-aside-header {
5
- padding: var(--rt-aside-inset);
5
+ .rt-aside-header {
6
+ padding: var(--rt-aside-inset);
6
7
 
7
- &__content {
8
- display: flex;
9
- min-width: 0;
10
- align-items: center;
11
- gap: var(--rt-space-sm);
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
- &__overline {
29
- overflow: hidden;
30
- margin: 0;
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
- &__title {
39
- overflow: hidden;
40
- min-width: 0;
41
- margin: 0;
42
- color: var(--rt-color-text-primary);
43
- font-size: var(--rt-text-xl);
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
- /* Ellipsis для длинного заголовка: skeleton-wrapper рендерит `{{ title }}`
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
- min-width: 0;
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
- /* Ряд бэйджей под title — переносится на новую строку при нехватке ширины. */
58
- &__badges {
59
- display: flex;
60
- flex-wrap: wrap;
61
- margin-top: var(--rt-space-1);
62
- gap: var(--rt-space-xs);
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
- &__badge-link {
67
- display: inline-flex;
68
- cursor: pointer;
69
- text-decoration: none;
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
- &:hover {
72
- opacity: 0.85;
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
- /* Ряд action-иконок справа от title (отклонить / на доработку / снять с
77
- публикации и т.п.). Пустой при отсутствии проекции — нулевой ширины. */
78
- &__actions {
79
- display: flex;
80
- flex-shrink: 0;
81
- align-items: center;
82
- gap: var(--rt-space-xs);
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
- &:empty {
85
- display: none;
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
- /* Size tokens — sm/md/lg (aside уже модалки чем rt-dialog). */
11
- :root {
12
- --rt-aside-width-sm: 400px;
13
- --rt-aside-width-md: 540px;
14
- --rt-aside-width-lg: 720px;
15
-
16
- /* Инсет панели: шапка, содержимое и футер отбиты от края одним и тем же
17
- значением, поэтому поля во всех панелях одной ширины. */
18
- --rt-aside-inset: var(--rt-space-lg);
19
-
20
- /* Ритм между корневыми блоками содержимого. */
21
- --rt-aside-content-gap: var(--rt-space-md);
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
- &__content {
68
- display: flex;
69
- min-width: 0;
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
- &--size--sm {
80
- width: var(--rt-aside-width, var(--rt-aside-width-sm));
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
- /* Контент — rt-tabs: скроллером становится контент активной вкладки, а не
92
- контентная зона асайда, чтобы полоса вкладок оставалась прибитой. */
93
- &--content--tabs {
94
- /* Контентная зона больше не скроллер, но её горизонтальный инсет СОХРАНЯЕМ:
95
- прямой контент вне rt-tabs (скелетоны загрузки, rt-message ошибки) должен
96
- отступать от краёв как обычно. Снимаем только нижний отступ. */
97
- .rt-aside__content {
98
- overflow: hidden;
99
- padding-block-end: 0;
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
- /* rt-tabs растягивается на всю ширину панели (гасит инсет контентной зоны),
103
- а инсет возвращается ВНУТРЬ полосы и скролл-контейнера. Так overflow
104
- скролл-контейнера не режет focus-ring инпутов, прижатых к краю, а полоса
105
- и контент остаются в коридоре --rt-aside-inset. */
106
- rt-tabs {
65
+ /* Единственная зона содержимого: она держит инсет панели и она же
66
+ прокручивается. Отступы живут здесь, а не в потребителях — иначе каждая
67
+ панель помнит про них сама, и поля получают разную ширину. */
68
+ &__content {
69
+ display: flex;
70
+ min-width: 0;
107
71
  min-height: 0;
108
72
  flex: 1 1 auto;
109
- margin-inline: calc(-1 * var(--rt-aside-inset));
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
- .rt-tabs__header {
113
- padding-inline: var(--rt-aside-inset);
80
+ &--size--sm {
81
+ width: var(--rt-aside-width, var(--rt-aside-width-sm));
114
82
  }
115
83
 
116
- .rt-tabs__content {
117
- /* Нижний отступ внутри скроллера — последний элемент не докручивается
118
- вплотную к футеру. */
119
- padding-bottom: var(--rt-aside-inset);
120
- padding-inline: var(--rt-aside-inset);
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
- rt-aside .rt-aside,
127
- rt-aside .rt-aside--size--sm,
128
- rt-aside .rt-aside--size--md,
129
- rt-aside .rt-aside--size--lg {
130
- width: 100dvw;
131
- max-width: 100dvw;
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
  }