@rt-tools/ui-kit-v2 0.10.0 → 0.12.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 (166) hide show
  1. package/README.md +110 -5
  2. package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs +947 -0
  3. package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs.map +1 -0
  4. package/fesm2022/rt-tools-ui-kit-v2.mjs +11558 -8313
  5. package/fesm2022/rt-tools-ui-kit-v2.mjs.map +1 -1
  6. package/package.json +8 -1
  7. package/rt-tools-ui-kit-v2-0.12.0.tgz +0 -0
  8. package/src/assets/fonts/montserrat-cyrillic-ext-wght-italic.woff2 +0 -0
  9. package/src/assets/fonts/montserrat-cyrillic-ext-wght-normal.woff2 +0 -0
  10. package/src/assets/fonts/montserrat-cyrillic-wght-italic.woff2 +0 -0
  11. package/src/assets/fonts/montserrat-cyrillic-wght-normal.woff2 +0 -0
  12. package/src/assets/fonts/montserrat-latin-ext-wght-italic.woff2 +0 -0
  13. package/src/assets/fonts/montserrat-latin-ext-wght-normal.woff2 +0 -0
  14. package/src/assets/fonts/montserrat-latin-wght-italic.woff2 +0 -0
  15. package/src/assets/fonts/montserrat-latin-wght-normal.woff2 +0 -0
  16. package/src/assets/icons/arrows.svg +9 -0
  17. package/src/assets/icons/equals.svg +8 -0
  18. package/src/assets/icons/user-off.svg +16 -0
  19. package/src/assets/icons-material/NOTICE.md +6 -2
  20. package/src/assets/icons-material/arrow-left.fill.svg +3 -0
  21. package/src/assets/icons-material/arrow-left.svg +1 -1
  22. package/src/assets/icons-material/arrow-right.fill.svg +3 -0
  23. package/src/assets/icons-material/arrow-right.svg +3 -0
  24. package/src/assets/icons-material/arrows.fill.svg +5 -0
  25. package/src/assets/icons-material/arrows.svg +5 -0
  26. package/src/assets/icons-material/ban.fill.svg +5 -0
  27. package/src/assets/icons-material/ban.svg +1 -1
  28. package/src/assets/icons-material/bars.fill.svg +3 -0
  29. package/src/assets/icons-material/bars.svg +1 -1
  30. package/src/assets/icons-material/check.fill.svg +3 -0
  31. package/src/assets/icons-material/check.svg +1 -1
  32. package/src/assets/icons-material/chevron-down.fill.svg +3 -0
  33. package/src/assets/icons-material/chevron-down.svg +1 -1
  34. package/src/assets/icons-material/chevron-left.fill.svg +3 -0
  35. package/src/assets/icons-material/chevron-left.svg +1 -1
  36. package/src/assets/icons-material/chevron-right.fill.svg +3 -0
  37. package/src/assets/icons-material/chevron-right.svg +1 -1
  38. package/src/assets/icons-material/close.fill.svg +3 -0
  39. package/src/assets/icons-material/close.svg +1 -1
  40. package/src/assets/icons-material/cloud-upload.fill.svg +5 -0
  41. package/src/assets/icons-material/cloud-upload.svg +1 -1
  42. package/src/assets/icons-material/cog.fill.svg +5 -0
  43. package/src/assets/icons-material/cog.svg +1 -1
  44. package/src/assets/icons-material/copy.fill.svg +5 -0
  45. package/src/assets/icons-material/copy.svg +1 -1
  46. package/src/assets/icons-material/ellipsis-h.fill.svg +5 -0
  47. package/src/assets/icons-material/ellipsis-h.svg +1 -1
  48. package/src/assets/icons-material/ellipsis-v.fill.svg +5 -0
  49. package/src/assets/icons-material/ellipsis-v.svg +1 -1
  50. package/src/assets/icons-material/email.fill.svg +5 -0
  51. package/src/assets/icons-material/email.svg +5 -0
  52. package/src/assets/icons-material/equals.fill.svg +3 -0
  53. package/src/assets/icons-material/equals.svg +3 -0
  54. package/src/assets/icons-material/external-link.fill.svg +5 -0
  55. package/src/assets/icons-material/external-link.svg +1 -1
  56. package/src/assets/icons-material/eye-slash.fill.svg +5 -0
  57. package/src/assets/icons-material/eye-slash.svg +1 -1
  58. package/src/assets/icons-material/eye.fill.svg +5 -0
  59. package/src/assets/icons-material/eye.svg +1 -1
  60. package/src/assets/icons-material/ico-download.fill.svg +5 -0
  61. package/src/assets/icons-material/ico-download.svg +1 -1
  62. package/src/assets/icons-material/ico-plus.fill.svg +3 -0
  63. package/src/assets/icons-material/ico-plus.svg +1 -1
  64. package/src/assets/icons-material/info-circle.fill.svg +5 -0
  65. package/src/assets/icons-material/info-circle.svg +1 -1
  66. package/src/assets/icons-material/pencil.fill.svg +5 -0
  67. package/src/assets/icons-material/pencil.svg +1 -1
  68. package/src/assets/icons-material/refresh.fill.svg +5 -0
  69. package/src/assets/icons-material/refresh.svg +1 -1
  70. package/src/assets/icons-material/search.fill.svg +5 -0
  71. package/src/assets/icons-material/search.svg +1 -1
  72. package/src/assets/icons-material/star.fill.svg +3 -0
  73. package/src/assets/icons-material/star.svg +1 -1
  74. package/src/assets/icons-material/sync.fill.svg +5 -0
  75. package/src/assets/icons-material/sync.svg +1 -1
  76. package/src/assets/icons-material/table.fill.svg +5 -0
  77. package/src/assets/icons-material/table.svg +1 -1
  78. package/src/assets/icons-material/tag.fill.svg +5 -0
  79. package/src/assets/icons-material/tag.svg +1 -1
  80. package/src/assets/icons-material/trash.fill.svg +5 -0
  81. package/src/assets/icons-material/trash.svg +1 -1
  82. package/src/assets/icons-material/user-off.fill.svg +5 -0
  83. package/src/assets/icons-material/user-off.svg +5 -0
  84. package/src/assets/icons-material/user.fill.svg +5 -0
  85. package/src/assets/icons-material/user.svg +1 -1
  86. package/src/lib/components/CONTEXT.md +3 -0
  87. package/src/lib/components/action-bar/CONTEXT.md +53 -0
  88. package/src/lib/components/action-bar/rt-action-bar-holder.component.scss +70 -0
  89. package/src/lib/components/action-bar/rt-action-bar.component.scss +122 -0
  90. package/src/lib/components/aside/CONTEXT.md +5 -1
  91. package/src/lib/components/aside/_rt-aside-overlay.scss +9 -0
  92. package/src/lib/components/aside/header/rt-aside-header.component.scss +18 -2
  93. package/src/lib/components/aside/rt-aside.component.scss +5 -1
  94. package/src/lib/components/autocomplete/CONTEXT.md +2 -1
  95. package/src/lib/components/button/CONTEXT.md +11 -11
  96. package/src/lib/components/checkbox/rt-checkbox.component.scss +5 -1
  97. package/src/lib/components/data-list/CONTEXT.md +122 -0
  98. package/src/lib/components/data-list/rt-data-list.component.scss +57 -0
  99. package/src/lib/components/data-list/settings/rt-data-list-settings-aside.component.scss +256 -0
  100. package/src/lib/components/data-list/toolbar/rt-data-list-toolbar.component.scss +128 -0
  101. package/src/lib/components/data-table/CONTEXT.md +102 -0
  102. package/src/lib/components/data-table/cell/rt-data-table-cell.component.scss +115 -0
  103. package/src/lib/components/data-table/filter-cell/rt-data-table-filter-cell.component.scss +51 -0
  104. package/src/lib/components/data-table/header-cell/rt-data-table-header-cell.component.scss +111 -0
  105. package/src/lib/components/data-table/rt-data-table.component.scss +263 -0
  106. package/src/lib/components/date-picker/rt-date-picker.component.scss +13 -0
  107. package/src/lib/components/delta-view/CONTEXT.md +1 -1
  108. package/src/lib/components/dialog/CONTEXT.md +4 -0
  109. package/src/lib/components/dynamic-list/CONTEXT.md +90 -0
  110. package/src/lib/components/dynamic-list/rt-dynamic-list.component.scss +123 -0
  111. package/src/lib/components/empty-state/CONTEXT.md +5 -0
  112. package/src/lib/components/empty-state/rt-empty-state.component.scss +19 -5
  113. package/src/lib/components/file-card/rt-file-card.component.scss +14 -0
  114. package/src/lib/components/file-drop/rt-file-drop.component.scss +44 -8
  115. package/src/lib/components/icon-button/rt-icon-button.component.scss +28 -4
  116. package/src/lib/components/input/rt-input.component.scss +25 -1
  117. package/src/lib/components/input-number/rt-input-number.component.scss +13 -0
  118. package/src/lib/components/menu/CONTEXT.md +10 -0
  119. package/src/lib/components/menu/rt-menu-item.component.scss +35 -3
  120. package/src/lib/components/menu/rt-menu.component.scss +15 -5
  121. package/src/lib/components/multiselect/CONTEXT.md +3 -0
  122. package/src/lib/components/multiselect/rt-multiselect.component.scss +58 -1
  123. package/src/lib/components/pagination/CONTEXT.md +4 -1
  124. package/src/lib/components/pagination/rt-pagination.component.scss +43 -13
  125. package/src/lib/components/radio-button/CONTEXT.md +42 -0
  126. package/src/lib/components/radio-button/rt-radio-button.component.scss +105 -0
  127. package/src/lib/components/scroll-area/CONTEXT.md +52 -0
  128. package/src/lib/components/scroll-area/rt-scroll-area.component.scss +69 -0
  129. package/src/lib/components/select/CONTEXT.md +8 -1
  130. package/src/lib/components/select/rt-select.component.scss +110 -7
  131. package/src/lib/components/table/CONTEXT.md +46 -1
  132. package/src/lib/components/table/filter-header/CONTEXT.md +64 -0
  133. package/src/lib/components/table/filter-header/rt-table-filter-header.component.scss +76 -0
  134. package/src/lib/components/table/rt-table.component.scss +32 -1
  135. package/src/lib/components/tag/CONTEXT.md +9 -0
  136. package/src/lib/components/tag/rt-tag.component.scss +38 -0
  137. package/src/lib/components/textarea/CONTEXT.md +1 -1
  138. package/src/lib/components/thread-list/CONTEXT.md +6 -1
  139. package/src/lib/components/toolbar/CONTEXT.md +3 -0
  140. package/src/lib/components/toolbar/rt-toolbar.component.scss +9 -2
  141. package/src/lib/components/tooltip/CONTEXT.md +4 -4
  142. package/src/lib/components/tooltip/rt-tooltip.component.scss +2 -2
  143. package/src/{lib → rich-editor/lib}/components/chat/CONTEXT.md +1 -1
  144. package/src/{lib → rich-editor/lib}/components/message-composer/CONTEXT.md +5 -1
  145. package/src/{lib → rich-editor/lib}/components/message-composer/rt-message-composer.component.scss +9 -0
  146. package/src/{lib → rich-editor/lib}/components/rich-editor/CONTEXT.md +2 -2
  147. package/src/styles/_coarse-pointer.scss +15 -0
  148. package/src/styles/_coexist.scss +28 -0
  149. package/src/styles/_fonts.scss +99 -0
  150. package/src/styles/_index.scss +13 -0
  151. package/src/styles/_preset-material.scss +201 -26
  152. package/src/styles/_primitives.scss +41 -5
  153. package/src/styles/_scrollbar.scss +16 -12
  154. package/src/styles/_semantic-lists.scss +89 -0
  155. package/src/styles/_semantic.scss +80 -9
  156. package/src/styles/_theme-dark.scss +36 -0
  157. package/src/styles/_theme-scope.scss +111 -0
  158. package/src/styles/tokens.coexist.scss +3 -0
  159. package/src/styles/tokens.package.scss +6 -0
  160. package/styles/tokens.coexist.css +27 -0
  161. package/styles/tokens.css +5443 -43
  162. package/types/rt-tools-ui-kit-v2-rich-editor.d.ts +529 -0
  163. package/types/rt-tools-ui-kit-v2.d.ts +2760 -1381
  164. package/rt-tools-ui-kit-v2-0.10.0.tgz +0 -0
  165. /package/src/{lib → rich-editor/lib}/components/chat/rt-chat.component.scss +0 -0
  166. /package/src/{lib → rich-editor/lib}/components/rich-editor/rt-rich-editor.component.scss +0 -0
@@ -0,0 +1,122 @@
1
+ # `rt-data-list<ENTITY, SORT, KEY>`
2
+
3
+ Список записей первого кита во втором: полоса действий сверху, [`rt-data-table`](../data-table/CONTEXT.md)
4
+ посередине, полоса страниц снизу. Список ничего не решает сам — он собирает семейство таблицы с
5
+ поиском, отбором, страницами и настройкой колонок и отдаёт приложению каждое нажатие. Material тут
6
+ нет вовсе: всё, что первый кит рисовал им, рисуют части кита.
7
+
8
+ ```html
9
+ <rt-data-list
10
+ rtDataListSelectors
11
+ tableConfigStorageKey="orders"
12
+ [entities]="rows()"
13
+ [pageModel]="page()"
14
+ [currentSortModel]="sort()"
15
+ [filterModel]="filters()"
16
+ [isFiltersShown]="true"
17
+ [loading]="loading()"
18
+ [fetching]="fetching()"
19
+ (searchChange)="onSearch($event)"
20
+ (pageModelChange)="onPage($event)"
21
+ (sortChange)="onSort($event)"
22
+ (filterChange)="onFilter($event)"
23
+ (refresh)="reload()">
24
+ <ng-template rtDataListRowActions let-row>
25
+ <rt-menu-item label="Открыть" icon="ico-eye" (selected)="open(row)" />
26
+ </ng-template>
27
+ </rt-data-list>
28
+ ```
29
+
30
+ | вход | тип | умолчание |
31
+ | ----------------------- | -------------------- | -------------- |
32
+ | `tableConfigStorageKey` | `string` | **обязателен** |
33
+ | `entities` | `ENTITY[]` | **обязателен** |
34
+ | `pageModel` | `IPageModel` | **обязателен** |
35
+ | `currentSortModel` | `ISortModel \| null` | **обязателен** |
36
+ | `filterModel` | `IFilterModel[]` | `[]` |
37
+ | `searchTerm` | `string \| null` | `''` |
38
+ | `keyExp` | `keyof ENTITY` | `'id'` |
39
+ | `loading` | `boolean` | `false` |
40
+ | `fetching` | `boolean` | `false` |
41
+ | `isFiltersShown` | `boolean` | `false` |
42
+ | `isTableRowsClickable` | `boolean` | `false` |
43
+ | `isRefreshButtonShown` | `boolean` | `true` |
44
+
45
+ | выход | тип |
46
+ | -------------------- | ------------------------ |
47
+ | `searchChange` | `string` |
48
+ | `pageModelChange` | `Partial<IPageModel>` |
49
+ | `sortChange` | `ISortModel` |
50
+ | `filterChange` | `IFilterModel[]` |
51
+ | `refresh` | `void` |
52
+ | `clearFiltersAction` | `void` |
53
+ | `rowClick` | `{ row: ENTITY, event }` |
54
+ | `rowDoubleClick` | `ENTITY` |
55
+
56
+ ## Главное, что нужно знать
57
+
58
+ **Своего состояния список не ведёт вовсе.** Страницу, порядок, условия отбора и набранное в поиске
59
+ он просит у приложения и рисует то, что придёт обратно. Поэтому список ничего не «применяет»: ответ
60
+ всегда за приложением, и оно же решает, ходить ли за ним на сервер.
61
+
62
+ **Службу настроек колонок объявляет приложение,** а не список: `RtDataTableConfigService` приложение
63
+ и создаёт, и наполняет колонками. Список её только читает и пишет в неё то, что человек сохранил в
64
+ боковой панели настройки. Так одна и та же настройка достаётся таблице, панели и приложению.
65
+
66
+ **Выбор записей ведёт директива `rtDataListSelectors`**, а рисуют его полоса действий и таблица.
67
+ Под «отметить все» отмечаются и те страницы, которые ещё не приходили: пришедшая страница отмечается
68
+ сама, снятая запись уходит в исключения и приходит неотмеченной каждый раз. Приложение читает и
69
+ отмеченные записи, и исключения — действие над всеми записями оно отправляет как «все, кроме этих».
70
+ Разведённый вид выключается входом `isMultiSelectExtendedMod`.
71
+
72
+ **Две загрузки выглядят по-разному.** Первая (`loading`) заменяет список крутилкой: показывать
73
+ нечего. Дозагрузка (`fetching`) оставляет строки на месте и кладёт крутилку поверх них с подложкой —
74
+ человек видит, что список тот же, а не новый.
75
+
76
+ **Заглушку показывают только без строк и без условий отбора.** Пустой ответ на заданное условие —
77
+ это не пустой список, и тогда видны таблица со строкой отбора и «снять отбор» в полосе действий.
78
+
79
+ **Панель настройки колонок поднимает служба боковых панелей кита.** Второе нажатие при открытой
80
+ панели ничего не открывает: у первого кита настройку сохраняла та панель, что закрылась последней.
81
+
82
+ ## Части семейства
83
+
84
+ | Часть | Что делает |
85
+ | -------------------------------- | ------------------------------------------------------------ |
86
+ | `rt-data-list-toolbar` | поиск, «отметить все» или счётчик, снятие отбора, обновление |
87
+ | `rt-data-list-settings-aside` | боковая панель настройки колонок и полос прокрутки |
88
+ | `rtDataListSelectors` | отметки по страницам, исключения, счётчик отмеченных |
89
+ | `rtDataListToolbarSelectors` | селекторы приложения слева в полосе действий |
90
+ | `rtDataListToolbarActions` | действия приложения справа в полосе действий |
91
+ | `rtDataListCustomCells` | шаблоны ячеек приложения: они уезжают в таблицу |
92
+ | `rtDataListRowActions` | пункты меню строки |
93
+ | `rtDataListAdditionalRowActions` | действия рядом с кнопкой меню строки |
94
+
95
+ ## Края
96
+
97
+ - Вход `isPaginationShown="false"` убирает полосу страниц из разметки; включённая полоса рисуется
98
+ по своим правилам. В первом ките вход ничего не менял.
99
+ - Полоса страниц исчезает сама, пока все записи помещаются на самую маленькую страницу.
100
+ - Флажок страницы после смены строк остаётся тем, каким был на прежней странице: его пересчитывает
101
+ директива выбора, когда страница приходит.
102
+ - Выбор полос прокрутки общий на всю страницу: список ставит их размер на корень страницы, и
103
+ сохранённый одним списком выбор достаётся каждому списку рядом — так было в первом ките. Уходя,
104
+ список снимает эти свойства с корня.
105
+ - Исключения не уходят вместе с отметками: `clearSelectedList()` снимает отметки, а исключения
106
+ очищает отдельная просьба `clearExcludedList()`. «Отметить все», поставленное заново, начинает
107
+ без исключений прошлого раза.
108
+ - Поле поиска следует за входом `searchTerm`, и непустой поиск приложения держит поле видимым и на
109
+ заглушке. Значение, равное последнему отправленному, поле не трогает: запоздалое эхо ответа
110
+ сервера или адресной строки не стирает дописанное человеком.
111
+ - Список и таблица читают базу браузера через `IDBStorageService` из `@rt-tools/core`. Без
112
+ `provideRtIDBStorage()` в провайдерах приложения страница пустая, а в консоли стоит
113
+ `NG0201: No provider found for _IDBStorageService`.
114
+ - Шаблон значка `rtDataTableIcon` ставится прямо внутри списка и уезжает в таблицу без обёртки.
115
+ - Отступы вокруг тулбара и под содержимым — имена `--rt-list-toolbar-padding-top`,
116
+ `--rt-list-toolbar-padding-bottom`, `--rt-list-toolbar-gap` и `--rt-list-content-padding-bottom`.
117
+ Под материальным набором тулбар стоит в 16px от верха и в 16px от таблицы, как в первом ките;
118
+ нижний отступ содержимого там 0, и приложение ставит его этим именем. Отступ стоит внутри
119
+ прокрутки таблицы: таблица сама прокручивается, и отступ уходит вниз вместе со строками.
120
+ - Место под заглушку пустого списка и под крутилку — имена `--rt-list-placeholder-min-height` и
121
+ `--rt-list-placeholder-grow`: в компактной секции приложение ставит `0`, и заглушка не тянется на
122
+ всю высоту.
@@ -0,0 +1,57 @@
1
+ @layer rt-kit.components {
2
+ /* rt-data-list — список записей первого кита. Полоса действий и полоса страниц стоят по краям,
3
+ таблица занимает остальное и прокручивается сама. Крутилка дозагрузки лежит поверх списка
4
+ ярусом sticky шкалы, а область таблицы замкнута в свой ярус: шапка таблицы стоит тем же
5
+ ярусом sticky и идёт в разметке позже, и без замыкания рисовалась бы поверх подложки. */
6
+
7
+ /* Ширина — вся колонка, как у хоста первого кита: без неё список в колонке с
8
+ `align-items: flex-start` сжимался до своего содержимого. */
9
+ .rt-data-list {
10
+ position: relative;
11
+ display: flex;
12
+ width: 100%;
13
+ height: 100%;
14
+ min-height: 0;
15
+ flex-direction: column;
16
+
17
+ &__loading,
18
+ &__placeholder {
19
+ display: flex;
20
+ min-height: var(--rt-list-placeholder-min-height);
21
+ flex-grow: var(--rt-list-placeholder-grow);
22
+ align-items: center;
23
+ justify-content: center;
24
+ }
25
+
26
+ /* Заглушка пустого списка берёт размеры и подложку из назначений списка — их переставляет набор. */
27
+ &__placeholder .rt-empty-state {
28
+ --rt-empty-state-icon-wrap-size: var(--rt-list-empty-icon-wrap-size);
29
+ --rt-empty-state-icon-wrap-bg: var(--rt-list-empty-icon-wrap-bg);
30
+ --rt-empty-state-icon-size: var(--rt-list-empty-icon-size);
31
+ --rt-empty-state-title-size: var(--rt-list-empty-title-size);
32
+ --rt-empty-state-title-weight: var(--rt-list-empty-title-weight);
33
+ }
34
+
35
+ /* Крутилка дозагрузки: строки под ней остаются видны сквозь подложку. */
36
+ &__fetching {
37
+ position: absolute;
38
+ z-index: var(--rt-z-sticky);
39
+ display: flex;
40
+ align-items: center;
41
+ justify-content: center;
42
+ background-color: color-mix(in srgb, var(--rt-color-bg-page) 60%, transparent);
43
+ inset: 0;
44
+ }
45
+
46
+ /* Свой ярус: ярусы шапки и полосы действий таблицы считаются внутри него и над крутилкой
47
+ дозагрузки не поднимаются. */
48
+ &__content {
49
+ display: flex;
50
+ overflow: hidden;
51
+ min-height: 0;
52
+ flex-direction: column;
53
+ flex-grow: 1;
54
+ isolation: isolate;
55
+ }
56
+ }
57
+ }
@@ -0,0 +1,256 @@
1
+ @layer rt-kit.components {
2
+ /* rt-data-list-settings-aside — панель настройки колонок в виде первого кита: подпись под
3
+ заголовком, переключатель слева от своей подписи, колонки залитыми плашками с ручкой ✥ и
4
+ глазом через черты. Промежутки 8px и 16px — ступени sm и md шкалы. */
5
+
6
+ .rt-data-list-settings-aside {
7
+ display: flex;
8
+ flex-direction: column;
9
+ gap: var(--rt-space-md);
10
+
11
+ &__switches {
12
+ display: flex;
13
+ flex-direction: column;
14
+ gap: var(--rt-space-sm);
15
+ }
16
+
17
+ /* Слово рядом с переключателем: своего содержимого `rt-toggle-switch` не рисует — без
18
+ строки-соседа в панели стояли бы два переключателя без подписи. */
19
+ &__switch-row {
20
+ display: flex;
21
+ align-items: center;
22
+ gap: var(--rt-space-md);
23
+ }
24
+
25
+ &__switch-label {
26
+ color: var(--rt-color-text-primary);
27
+ font-size: var(--rt-text-sm);
28
+ }
29
+
30
+ /* Подпись сохранения — прописными, подпись отмены — как написана: так подвал панели
31
+ рисует первый кит. */
32
+ &__save {
33
+ text-transform: uppercase;
34
+ }
35
+
36
+ &__columns {
37
+ display: flex;
38
+ flex-direction: column;
39
+ padding: 0;
40
+ margin: 0;
41
+ gap: var(--rt-space-sm);
42
+ list-style: none;
43
+ }
44
+
45
+ /* Плашка колонки: залита, без рамки — так рисует список первого кита. Свои свойства она
46
+ объявляет на себе, а не на корне блока: тянутую плашку наложение переносит в конец
47
+ страницы, и с корня блока до неё ничего не дошло бы. */
48
+ &__column {
49
+ --rt-data-list-settings-aside-radius: var(--rt-radius-md);
50
+ --rt-data-list-settings-aside-divider-width: var(--rt-border-width-thin);
51
+ --rt-data-list-settings-aside-drag-shadow: var(--rt-shadow-lg);
52
+ --rt-data-list-settings-aside-drag-duration: var(--rt-duration-base);
53
+ --rt-data-list-settings-aside-padding-start: 0;
54
+ --rt-data-list-settings-aside-padding-end: var(--rt-space-sm);
55
+ --rt-data-list-settings-aside-color: var(--rt-color-text-primary);
56
+
57
+ display: flex;
58
+ align-items: center;
59
+ border-radius: var(--rt-data-list-settings-aside-radius);
60
+ background-color: var(--rt-list-settings-item-bg);
61
+ color: var(--rt-data-list-settings-aside-color);
62
+ gap: var(--rt-space-sm);
63
+ padding-inline: var(--rt-data-list-settings-aside-padding-start) var(--rt-data-list-settings-aside-padding-end);
64
+
65
+ &--hidden {
66
+ --rt-data-list-settings-aside-color: var(--rt-color-text-muted);
67
+ }
68
+
69
+ /* Тянутая плашка лежит над страницей с тенью; место, откуда её взяли, пустеет, а
70
+ соседи съезжают плавно — как у списка первого кита. */
71
+ &.cdk-drag-preview {
72
+ box-sizing: border-box;
73
+ box-shadow: var(--rt-data-list-settings-aside-drag-shadow);
74
+ }
75
+
76
+ &.cdk-drag-placeholder {
77
+ opacity: 0;
78
+ }
79
+
80
+ &.cdk-drag-animating {
81
+ transition: transform var(--rt-data-list-settings-aside-drag-duration) ease-out;
82
+ }
83
+ }
84
+
85
+ &__columns.cdk-drop-list-dragging &__column:not(.cdk-drag-placeholder) {
86
+ transition: transform var(--rt-data-list-settings-aside-drag-duration) ease-out;
87
+ }
88
+
89
+ /* Ручка и черта справа от неё — одна кнопка: черта отделяет её от имени, как в первом
90
+ ките. Черта — рамка, а не полоса шириной в ступень рамки. */
91
+ &__handle {
92
+ display: inline-flex;
93
+ align-items: center;
94
+ align-self: stretch;
95
+ justify-content: center;
96
+ padding: 0 var(--rt-space-sm);
97
+ border: none;
98
+ border-right: var(--rt-data-list-settings-aside-divider-width) solid var(--rt-color-border-subtle);
99
+ background: transparent;
100
+ color: inherit;
101
+ cursor: grab;
102
+
103
+ &:disabled {
104
+ cursor: default;
105
+ }
106
+ }
107
+
108
+ &__column-label {
109
+ overflow: hidden;
110
+ min-width: 0;
111
+ flex: 1 1 auto;
112
+ font-size: var(--rt-text-sm);
113
+ text-overflow: ellipsis;
114
+ white-space: nowrap;
115
+ }
116
+
117
+ &__toggle {
118
+ border-left: var(--rt-data-list-settings-aside-divider-width) solid var(--rt-color-border-subtle);
119
+ padding-inline-start: var(--rt-space-sm);
120
+ }
121
+ }
122
+
123
+ /* Вид первого кита: панель открыта списком с материальным набором (класс набора стоит на
124
+ панели поверх страницы) или страница целиком под набором. Числа сняты с панели колонок
125
+ первого кита на его витрине: поля 32px, заголовок 24px, переключатели 48×24 через 32px,
126
+ плашки 48px, кнопки-таблетки 36px без черты над ними. Цвета переключателя даёт сам
127
+ материальный набор; здесь — размеры, которых у набора нет.
128
+
129
+ Свойства вложенных блоков переназначаются правилом той же цели и большей силы: каждый
130
+ блок объявляет свои на себе, и унаследованное значение до них не дошло бы. */
131
+ :is(.rt-preset-material, [data-preset='material']) .rt-data-list-settings-aside {
132
+ --rt-aside-inset: var(--rt-space-xl);
133
+ --rt-aside-content-gap: var(--rt-space-xl);
134
+ --rt-data-list-settings-aside-control-size: 36px;
135
+ --rt-data-list-settings-aside-back-icon-size: 24px;
136
+ --rt-data-list-settings-aside-header-height: 96px;
137
+
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);
144
+ }
145
+
146
+ /* Кнопка «назад» — круглая `mat-icon-button` первого кита, как и кнопки подвала панели. */
147
+ .rt-aside-header__back .rt-icon-button {
148
+ --rt-icon-button-size: var(--rt-data-list-settings-aside-control-size);
149
+ --rt-icon-button-color: var(--rt-list-settings-icon-color);
150
+ --rt-icon-button-square-radius: var(--rt-radius-full);
151
+ }
152
+
153
+ .rt-aside-header__back .rt-icon {
154
+ min-width: var(--rt-data-list-settings-aside-back-icon-size);
155
+ min-height: var(--rt-data-list-settings-aside-back-icon-size);
156
+ }
157
+
158
+ .rt-aside-footer {
159
+ --rt-aside-footer-border-width: 0;
160
+ }
161
+
162
+ .rt-aside-footer__content {
163
+ justify-content: flex-end;
164
+ gap: var(--rt-space-md);
165
+ }
166
+
167
+ .rt-aside-footer .rt-button {
168
+ --rt-btn-height: var(--rt-data-list-settings-aside-control-size);
169
+ --rt-btn-radius: var(--rt-radius-full);
170
+ --rt-btn-padding: 0 var(--rt-space-6);
171
+ --rt-btn-font-size: var(--rt-text-sm);
172
+ }
173
+
174
+ .rt-aside-footer .rt-button--text {
175
+ --rt-btn-padding: 0 var(--rt-space-sm);
176
+ }
177
+
178
+ .rt-toggle-switch {
179
+ --rt-toggle-track-width: 48px;
180
+ --rt-toggle-track-height: 24px;
181
+ --rt-toggle-thumb-size: 20px;
182
+ --rt-toggle-thumb-inset: 2px;
183
+ --rt-toggle-thumb-travel: 24px;
184
+ }
185
+
186
+ .rt-data-list-settings-aside__switches {
187
+ gap: var(--rt-space-xl);
188
+ }
189
+
190
+ .rt-data-list-settings-aside__switch-label {
191
+ color: var(--rt-color-text-muted);
192
+
193
+ &--on {
194
+ color: var(--rt-color-text-primary);
195
+ }
196
+ }
197
+ }
198
+
199
+ /* Плашка колонки в виде первого кита — и в панели, и тянутая: тянутая лежит в конце страницы
200
+ и несёт класс набора на себе, поэтому цель правила — сама плашка, а не панель вокруг. */
201
+ .rt-data-list-settings-aside__column:is(.rt-preset-material, .rt-preset-material *, [data-preset='material'] *) {
202
+ --rt-data-list-settings-aside-radius: var(--rt-list-settings-item-radius);
203
+ --rt-data-list-settings-aside-drag-shadow: var(--rt-shadow-xl);
204
+ --rt-data-list-settings-aside-column-height: 48px;
205
+ --rt-data-list-settings-aside-control-size: 36px;
206
+ --rt-data-list-settings-aside-icon-size: 18px;
207
+ --rt-data-list-settings-aside-padding-start: var(--rt-space-xs);
208
+ --rt-data-list-settings-aside-padding-end: var(--rt-space-xs);
209
+ --rt-data-list-settings-aside-color: var(--rt-color-text-primary);
210
+
211
+ min-height: var(--rt-data-list-settings-aside-column-height);
212
+ font-size: var(--rt-text-md);
213
+
214
+ .rt-data-list-settings-aside__handle {
215
+ min-width: calc(var(--rt-data-list-settings-aside-control-size) + 2 * var(--rt-space-xs));
216
+ height: var(--rt-data-list-settings-aside-control-size);
217
+ align-self: center;
218
+ padding: 0 var(--rt-space-xs);
219
+ border-right-color: var(--rt-color-border-strong);
220
+ color: var(--rt-list-settings-icon-color);
221
+ margin-inline-end: var(--rt-space-xs);
222
+
223
+ .rt-icon {
224
+ min-width: var(--rt-data-list-settings-aside-icon-size);
225
+ min-height: var(--rt-data-list-settings-aside-icon-size);
226
+ }
227
+ }
228
+
229
+ .rt-data-list-settings-aside__column-label {
230
+ font-size: var(--rt-text-md);
231
+ }
232
+
233
+ .rt-data-list-settings-aside__toggle {
234
+ border-left: none;
235
+ padding-inline-start: 0;
236
+ }
237
+
238
+ .rt-data-list-settings-aside__toggle .rt-icon-button {
239
+ --rt-icon-button-size: var(--rt-data-list-settings-aside-control-size);
240
+ --rt-icon-button-color: var(--rt-list-settings-icon-color);
241
+ }
242
+ }
243
+ }
244
+
245
+ /* rt-layer-outside: фон, цвет и поля тянутой плашки.
246
+
247
+ CDK кладёт тянутую плашку в конец страницы и в момент перетаскивания подключает свой слой
248
+ `cdk-resets` с `.cdk-drag-preview { background: none; color: inherit; padding: 0 }`. Слой
249
+ появляется на странице позже слоя кита и потому сильнее его: оставленные в слое, три свойства
250
+ ниже проигрывают, и плашка едет прозрачной, без полей. Размеры и тень остаются в слое — их
251
+ CDK не трогает. */
252
+ .rt-data-list-settings-aside__column.cdk-drag-preview {
253
+ background-color: var(--rt-list-settings-item-bg);
254
+ color: var(--rt-data-list-settings-aside-color);
255
+ padding-inline: var(--rt-data-list-settings-aside-padding-start) var(--rt-data-list-settings-aside-padding-end);
256
+ }
@@ -0,0 +1,128 @@
1
+ @use '../../../../styles/breakpoints' as bp;
2
+
3
+ @layer rt-kit.components {
4
+ /* rt-data-list-toolbar — панель действий списка первого кита. Промежутки 8px и 16px — ступени
5
+ sm и md шкалы, ширина поля поиска 240px — размер 60 шкалы. На узком экране поиск уходит на
6
+ свою строку: в ряд с кнопками он там не помещается. */
7
+
8
+ .rt-data-list-toolbar {
9
+ --rt-data-list-toolbar-divider-width: var(--rt-border-width-thin);
10
+
11
+ display: block;
12
+ width: 100%;
13
+ margin-bottom: var(--rt-list-toolbar-gap);
14
+
15
+ // Отступы полосы берутся из имён списка: материальный набор даёт 16px сверху и 16px до таблицы.
16
+ .rt-toolbar {
17
+ --rt-toolbar-padding-top: var(--rt-list-toolbar-padding-top);
18
+ --rt-toolbar-padding-bottom: var(--rt-list-toolbar-padding-bottom);
19
+ }
20
+
21
+ &__selectors {
22
+ display: flex;
23
+ align-items: center;
24
+ gap: var(--rt-space-md);
25
+
26
+ .rt-checkbox {
27
+ --rt-checkbox-color-label: var(--rt-list-selector-label-color);
28
+ }
29
+ }
30
+
31
+ &__counter {
32
+ color: var(--rt-color-text-muted);
33
+ font-size: var(--rt-text-sm);
34
+ }
35
+
36
+ &__right {
37
+ display: flex;
38
+ width: 100%;
39
+ align-items: center;
40
+ justify-content: flex-end;
41
+ gap: var(--rt-space-md);
42
+ }
43
+
44
+ // Кнопки действий — свои и приложения — берут вид из имён действий списка: материальный
45
+ // набор делает из них круглые кнопки действия первого кита, свой оставляет кнопками-значками.
46
+ // Значок растёт наименьшим размером: свой размер значок кнопки ставит в разметке.
47
+ &__actions {
48
+ display: flex;
49
+ align-items: center;
50
+ gap: var(--rt-list-action-gap);
51
+
52
+ rt-icon-button {
53
+ --rt-icon-button-color: var(--rt-list-action-color);
54
+ }
55
+
56
+ .rt-icon-button {
57
+ --rt-icon-button-square-radius: var(--rt-list-action-radius);
58
+ --rt-icon-button-shadow: var(--rt-list-action-shadow);
59
+ --rt-icon-button-shadow-hover: var(--rt-list-action-shadow-hover);
60
+ --rt-icon-button-color-hover: var(--rt-list-action-color-hover);
61
+ --rt-icon-button-color-bg-hover: var(--rt-list-action-color-bg-hover);
62
+ }
63
+
64
+ .rt-icon-button__icon {
65
+ min-width: var(--rt-list-action-icon-size);
66
+ min-height: var(--rt-list-action-icon-size);
67
+ }
68
+ }
69
+
70
+ /* Черта отделяет действия приложения от кнопок кита: это рамка, а не полоса шириной в
71
+ ступень рамки — ступени рамок размеров не задают. */
72
+ &__divider {
73
+ height: var(--rt-list-action-divider-height);
74
+ border-left: var(--rt-data-list-toolbar-divider-width) solid var(--rt-color-border-subtle);
75
+ }
76
+
77
+ // Правая часть тулбара списка занимает всё место после левой, а не ширину своего содержимого:
78
+ // у поиска содержимого для счёта нет (он сжимаемый), и по содержимому часть сжалась бы до
79
+ // кнопок. Общий тулбар кита правую часть не растягивает — это правило только списка.
80
+ .rt-toolbar__bar--right {
81
+ flex-grow: 1;
82
+ }
83
+
84
+ // Поиск стоит на своей ширине, пока ему хватает места, и уступает, когда не хватает:
85
+ // узкая колонка бывает и на широком окне, где запрос по ширине окна ниже не сработает.
86
+ // Своей наименьшей ширины у поиска нет: поле ввода внутри несёт собственную, и она держала
87
+ // правую часть тулбара на 256 px в колонке 222 px. Ширину решает место, а не содержимое.
88
+ // 240px — исходный размер во флексе, а не ширина: заданная ширина браузер считает наименьшим
89
+ // размером поля, и в колонке 322 px правая часть держала все 240 px и вылезала за край.
90
+ // Высоту, скругление и рамку поле поиска берёт из имён поиска списка: материальный набор
91
+ // делает из них поле Material первого кита, свой набор оставляет поле как есть.
92
+ &__search {
93
+ --rt-input-height-sm: var(--rt-list-search-height);
94
+ --rt-input-radius: var(--rt-list-search-radius);
95
+ --rt-input-color-border: var(--rt-list-search-color-border);
96
+ --rt-input-color-bg: var(--rt-list-search-color-bg);
97
+ --rt-input-padding-x: var(--rt-list-search-padding-x);
98
+ --rt-input-gap: var(--rt-list-search-gap);
99
+ --rt-input-font-size: var(--rt-list-search-font-size);
100
+ --rt-input-icon-size: var(--rt-list-search-icon-size);
101
+ --rt-input-icon-color: var(--rt-list-search-icon-color);
102
+ --rt-input-color-text-placeholder: var(--rt-list-search-color-placeholder);
103
+
104
+ min-width: 0;
105
+ flex: 0 1 var(--rt-list-search-width);
106
+ contain: inline-size;
107
+ }
108
+
109
+ // Залитое поле скругляется своим свойством, и объявлено оно на самом поле: имя поиска до
110
+ // него не доходило, и перекрашенное приложением скругление поиска залитому полю не
111
+ // доставалось. Под материальным набором оно берёт имя поиска — оба там 4px, так что
112
+ // без правки приложения вид не меняется. Свой вид кита держит у залитого поля малое
113
+ // скругление, отличное от скругления поиска.
114
+ :is(.rt-preset-material, [data-preset='material']) &__search .rt-input {
115
+ --rt-input-fill-radius: var(--rt-list-search-radius);
116
+ }
117
+
118
+ @media (width <= #{bp.$rt-bp-lg}) {
119
+ &__right {
120
+ flex-wrap: wrap;
121
+ }
122
+
123
+ &__search {
124
+ flex-basis: 100%;
125
+ }
126
+ }
127
+ }
128
+ }