@rt-tools/ui-kit-v2 0.11.0 → 0.13.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 (167) 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 +12236 -8927
  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.13.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 +19 -16
  87. package/src/lib/components/accordion/CONTEXT.md +31 -0
  88. package/src/lib/components/accordion/rt-accordion.component.scss +61 -0
  89. package/src/lib/components/action-bar/CONTEXT.md +53 -0
  90. package/src/lib/components/action-bar/rt-action-bar-holder.component.scss +70 -0
  91. package/src/lib/components/action-bar/rt-action-bar.component.scss +122 -0
  92. package/src/lib/components/aside/CONTEXT.md +5 -1
  93. package/src/lib/components/aside/_rt-aside-overlay.scss +9 -0
  94. package/src/lib/components/aside/header/rt-aside-header.component.scss +18 -2
  95. package/src/lib/components/aside/rt-aside.component.scss +5 -1
  96. package/src/lib/components/autocomplete/CONTEXT.md +2 -1
  97. package/src/lib/components/button/CONTEXT.md +11 -11
  98. package/src/lib/components/checkbox/rt-checkbox.component.scss +5 -1
  99. package/src/lib/components/data-list/CONTEXT.md +122 -0
  100. package/src/lib/components/data-list/rt-data-list.component.scss +57 -0
  101. package/src/lib/components/data-list/settings/rt-data-list-settings-aside.component.scss +256 -0
  102. package/src/lib/components/data-list/toolbar/rt-data-list-toolbar.component.scss +128 -0
  103. package/src/lib/components/data-table/CONTEXT.md +102 -0
  104. package/src/lib/components/data-table/cell/rt-data-table-cell.component.scss +115 -0
  105. package/src/lib/components/data-table/filter-cell/rt-data-table-filter-cell.component.scss +51 -0
  106. package/src/lib/components/data-table/header-cell/rt-data-table-header-cell.component.scss +111 -0
  107. package/src/lib/components/data-table/rt-data-table.component.scss +263 -0
  108. package/src/lib/components/date-picker/rt-date-picker.component.scss +13 -0
  109. package/src/lib/components/delta-view/CONTEXT.md +1 -1
  110. package/src/lib/components/dialog/CONTEXT.md +4 -0
  111. package/src/lib/components/dynamic-list/CONTEXT.md +90 -0
  112. package/src/lib/components/dynamic-list/rt-dynamic-list.component.scss +123 -0
  113. package/src/lib/components/empty-state/CONTEXT.md +5 -0
  114. package/src/lib/components/empty-state/rt-empty-state.component.scss +19 -5
  115. package/src/lib/components/file-card/rt-file-card.component.scss +14 -0
  116. package/src/lib/components/file-drop/rt-file-drop.component.scss +44 -8
  117. package/src/lib/components/icon-button/rt-icon-button.component.scss +28 -4
  118. package/src/lib/components/input/rt-input.component.scss +25 -1
  119. package/src/lib/components/input-number/rt-input-number.component.scss +13 -0
  120. package/src/lib/components/menu/CONTEXT.md +10 -0
  121. package/src/lib/components/menu/rt-menu-item.component.scss +35 -3
  122. package/src/lib/components/menu/rt-menu.component.scss +15 -5
  123. package/src/lib/components/multiselect/CONTEXT.md +3 -0
  124. package/src/lib/components/multiselect/rt-multiselect.component.scss +58 -1
  125. package/src/lib/components/pagination/CONTEXT.md +4 -1
  126. package/src/lib/components/pagination/rt-pagination.component.scss +43 -13
  127. package/src/lib/components/radio-button/CONTEXT.md +42 -0
  128. package/src/lib/components/radio-button/rt-radio-button.component.scss +105 -0
  129. package/src/lib/components/scroll-area/CONTEXT.md +52 -0
  130. package/src/lib/components/scroll-area/rt-scroll-area.component.scss +69 -0
  131. package/src/lib/components/select/CONTEXT.md +8 -1
  132. package/src/lib/components/select/rt-select.component.scss +110 -7
  133. package/src/lib/components/table/CONTEXT.md +46 -1
  134. package/src/lib/components/table/filter-header/CONTEXT.md +64 -0
  135. package/src/lib/components/table/filter-header/rt-table-filter-header.component.scss +76 -0
  136. package/src/lib/components/table/rt-table.component.scss +32 -1
  137. package/src/lib/components/tag/CONTEXT.md +9 -0
  138. package/src/lib/components/tag/rt-tag.component.scss +38 -0
  139. package/src/lib/components/textarea/CONTEXT.md +1 -1
  140. package/src/lib/components/toolbar/CONTEXT.md +3 -0
  141. package/src/lib/components/toolbar/rt-toolbar.component.scss +9 -2
  142. package/src/lib/components/tooltip/CONTEXT.md +4 -4
  143. package/src/lib/components/tooltip/rt-tooltip.component.scss +2 -2
  144. package/src/{lib → rich-editor/lib}/components/chat/CONTEXT.md +1 -1
  145. package/src/{lib → rich-editor/lib}/components/message-composer/CONTEXT.md +5 -1
  146. package/src/{lib → rich-editor/lib}/components/message-composer/rt-message-composer.component.scss +9 -0
  147. package/src/{lib → rich-editor/lib}/components/rich-editor/CONTEXT.md +2 -2
  148. package/src/styles/_coarse-pointer.scss +15 -0
  149. package/src/styles/_coexist.scss +28 -0
  150. package/src/styles/_fonts.scss +99 -0
  151. package/src/styles/_index.scss +13 -0
  152. package/src/styles/_preset-material.scss +201 -26
  153. package/src/styles/_primitives.scss +41 -5
  154. package/src/styles/_scrollbar.scss +16 -12
  155. package/src/styles/_semantic-lists.scss +89 -0
  156. package/src/styles/_semantic.scss +80 -9
  157. package/src/styles/_theme-dark.scss +36 -0
  158. package/src/styles/_theme-scope.scss +111 -0
  159. package/src/styles/tokens.coexist.scss +3 -0
  160. package/src/styles/tokens.package.scss +6 -0
  161. package/styles/tokens.coexist.css +27 -0
  162. package/styles/tokens.css +5443 -43
  163. package/types/rt-tools-ui-kit-v2-rich-editor.d.ts +529 -0
  164. package/types/rt-tools-ui-kit-v2.d.ts +2778 -1375
  165. package/rt-tools-ui-kit-v2-0.11.0.tgz +0 -0
  166. /package/src/{lib → rich-editor/lib}/components/chat/rt-chat.component.scss +0 -0
  167. /package/src/{lib → rich-editor/lib}/components/rich-editor/rt-rich-editor.component.scss +0 -0
@@ -0,0 +1,102 @@
1
+ # `rt-data-table<ENTITY, SORT, KEY>`
2
+
3
+ Таблица записей первого кита во втором: шапка, строка отбора, готовые ячейки, колонка выбора и
4
+ полоса действий в конце строки. Она стоит рядом с [`rt-table`](../table/CONTEXT.md) и её не
5
+ заменяет: приложение выбирает, какую брать на экране. Material тут нет вовсе — всё, что первый
6
+ кит рисовал им, рисуют части кита.
7
+
8
+ ```html
9
+ <rt-data-table
10
+ rtDataTableSelectors
11
+ [entities]="rows()"
12
+ [currentSortModel]="sort()"
13
+ [filterModel]="filters()"
14
+ [isFiltersShown]="true"
15
+ [isTableRowsClickable]="true"
16
+ [isSelectorColumnShown]="true"
17
+ (sortChange)="onSort($event)"
18
+ (filterChange)="onFilter($event)"
19
+ (rowClick)="onRow($event.row)">
20
+ <ng-template rtDataTableRowActions let-row>
21
+ <rt-menu-item label="Открыть" icon="ico-eye" (selected)="open(row)" />
22
+ </ng-template>
23
+ </rt-data-table>
24
+ ```
25
+
26
+ | вход | тип | умолчание |
27
+ | ---------------------- | -------------------- | -------------- |
28
+ | `entities` | `ENTITY[]` | **обязателен** |
29
+ | `currentSortModel` | `ISortModel \| null` | **обязателен** |
30
+ | `filterModel` | `IFilterModel[]` | `[]` |
31
+ | `isFiltersShown` | `boolean` | `false` |
32
+ | `isTableRowsClickable` | `boolean` | `false` |
33
+ | `keyExp` | `keyof ENTITY` | `'id'` |
34
+
35
+ | выход | тип |
36
+ | ---------------- | ------------------------ |
37
+ | `rowClick` | `{ row: ENTITY, event }` |
38
+ | `rowDoubleClick` | `ENTITY` |
39
+ | `sortChange` | `ISortModel` |
40
+ | `filterChange` | `IFilterModel[]` |
41
+
42
+ ## Главное, что нужно знать
43
+
44
+ **Своего порядка, своего отбора и своей страницы таблица не ведёт.** Она просит о них приложение
45
+ и рисует то, что придёт обратно: новый набор строк, новый порядок, новый набор условий. Поэтому
46
+ сама по себе таблица ничего не «применяет» — ответ всегда за приложением.
47
+
48
+ **Колонки приходят не входом, а от службы настроек** `RtDataTableConfigService`: порядок колонок,
49
+ их видимость и два признака полос прокрутки она читает из базы браузера под ключом приложения и в
50
+ той же форме, что писал первый кит. Службу приложение объявляет само — таблица её только читает.
51
+ База браузера приходит от `provideRtIDBStorage()` из `@rt-tools/core`: без него в провайдерах
52
+ приложения страница пустая, а в консоли стоит `NG0201: No provider found for _IDBStorageService`.
53
+
54
+ **Отметки строк ведёт директива `rtDataTableSelectors`**, а таблица их рисует. Директива держит
55
+ сами записи, а не только ключи: запись, отмеченная на странице, которой на экране уже нет,
56
+ остаётся отмеченной и уходит приложению целиком. Без директивы колонки выбора нет вовсе.
57
+
58
+ **Строки различаются ключом записи** (`keyExp`, по умолчанию `id`): им идёт слежение в цикле, и
59
+ флажок строки принадлежит записи, а не месту в списке. Первый кит следил по месту, и при смене
60
+ страницы флажок доставался соседней записи.
61
+
62
+ **Нажатие на строку приходит по нажатию кнопки указателя, а не по отпусканию** — так двойное
63
+ нажатие приходит после двух одинарных. Нажатие в ячейке выбора и на кнопке меню строки до строки
64
+ не доходит: обе помечены признаком `rt-data-table-stop-row-click`. Тем же признаком приложение
65
+ отмечает свои части строки — прямо в разметке или директивой `rtDataTableStopRowClick`.
66
+
67
+ **Полоса действий висит над концом строки** и проявляется наведением; где наведения нет, она
68
+ видна всегда. Действия приложения стоят перед кнопкой меню строки, а место под полосу держит
69
+ пустая ячейка — её ширину таблица ставит сама по ширине полосы.
70
+
71
+ **Значки из описаний колонок рисует набор кита** по перечню соответствий имён первого кита. Своё
72
+ приложение отдаёт шаблоном `rtDataTableIcon` внутри таблицы: он получает имя значка, колонку и — в
73
+ ячейке — строку, и тогда перечень кита не спрашивается вовсе. Имя без пары в перечне ячейка рисует
74
+ глифом шрифта Material Symbols, как первый кит. Шрифт кит не везёт: глиф виден, где его подключило
75
+ приложение.
76
+
77
+ ## Части семейства
78
+
79
+ | Часть | Что делает |
80
+ | --------------------------------- | ------------------------------------------------------------------- |
81
+ | `rt-data-table-cell` | готовая ячейка: значение, прочерк у пустого, подсказка, копирование |
82
+ | `rt-data-table-header-cell` | ячейка шапки: подпись, значок, стрелки порядка |
83
+ | `rt-data-table-filter-cell` | ячейка строки отбора: поле, число, дата, список и вид сравнения |
84
+ | `rtDataTableCustomCells` | шаблоны ячеек приложения: колонка типа `custom` рисуется ими |
85
+ | `rtDataTableRowActions` | пункты меню строки |
86
+ | `rtDataTableAdditionalRowActions` | действия рядом с кнопкой меню |
87
+ | `rtDataTableSelectors` | отметки строк, флажок страницы, признаки колонки выбора |
88
+ | `RtDataTableConfigService` | настройки таблицы в базе браузера под ключом и в форме первого кита |
89
+
90
+ ## Края
91
+
92
+ - Колонка типа `custom` без шаблона рисует пустую ячейку: готовую таблица в ней не берёт.
93
+ - Признаки `filtering`, `filteringMultiple`, `href`, `className` и `fixed` описание колонки
94
+ принимает и ничего ими не меняет — так же, как в первом ките.
95
+ - Флажок страницы таблица сама не пересчитывает при смене строк: состояние остаётся тем, каким
96
+ было на прежней странице. Пересчитать его просит список — `setExistingEntitiesState()`.
97
+ - Размер полос прокрутки таблица берёт с корня страницы: туда его ставит список по сохранённой
98
+ настройке. Без списка полосы кита обычные. Скрытая полоса — нулевой размер, а не запрет
99
+ прокрутки: содержимое по-прежнему ездит.
100
+ - Выбор по одной рисует радиокнопку, и флажка страницы в шапке нет.
101
+ - Отметки, названные заранее (`selectedEntitiesKeys`), ставятся один раз — к первым непустым
102
+ строкам; позже присланный набор уже ничего не переписывает.
@@ -0,0 +1,115 @@
1
+ @layer rt-kit.components {
2
+ /* rt-data-table-cell — готовая ячейка таблицы первого кита. Размеры первого кита лежат на
3
+ шкале: промежуток и поля 8px — ступень sm, отступ кнопки копирования 4px — ступень xs,
4
+ значок 24px — размер lg набора. Кнопка копирования стоит поверх края ячейки и
5
+ проявляется наведением; где наведения нет, она видна всегда. */
6
+
7
+ .rt-data-table-cell {
8
+ --rt-data-table-cell-transition-duration: var(--rt-duration-fast);
9
+ --rt-data-table-cell-glyph-size: var(--rt-size-6);
10
+
11
+ position: relative;
12
+ display: flex;
13
+ width: 100%;
14
+ height: 100%;
15
+ align-items: center;
16
+ gap: var(--rt-space-sm);
17
+
18
+ /* Глиф Material Symbols для имени без пары в перечне соответствий — лигатура шрифта,
19
+ которую подключает приложение. Размер 24px — размер lg значка кита. */
20
+ &__glyph {
21
+ display: inline-block;
22
+ overflow: hidden;
23
+ width: var(--rt-data-table-cell-glyph-size);
24
+ font-family: 'Material Symbols Outlined', sans-serif;
25
+ font-feature-settings: 'liga';
26
+ font-size: var(--rt-data-table-cell-glyph-size);
27
+ font-style: normal;
28
+ font-weight: var(--rt-font-weight-regular);
29
+ letter-spacing: normal;
30
+ line-height: 1;
31
+ text-transform: none;
32
+ white-space: nowrap;
33
+
34
+ &--filled {
35
+ font-variation-settings: 'FILL' 1;
36
+ }
37
+ }
38
+
39
+ &__prefix,
40
+ &__suffix {
41
+ display: inline-flex;
42
+ min-width: fit-content;
43
+ flex: 0 0 auto;
44
+ }
45
+
46
+ /* Значение длиннее места обрезается многоточием: раскладка fixed даёт тексту ширину
47
+ ячейки, а не ширину значения. Подсказку с целым значением получает только обрезанное. */
48
+ &__title {
49
+ display: table;
50
+ width: 100%;
51
+ table-layout: fixed;
52
+
53
+ &--align--left {
54
+ text-align: left;
55
+ }
56
+
57
+ &--align--center {
58
+ text-align: center;
59
+ }
60
+
61
+ &--align--right {
62
+ text-align: right;
63
+ }
64
+ }
65
+
66
+ &__text {
67
+ overflow: hidden;
68
+ width: 100%;
69
+ padding: var(--rt-space-sm) var(--rt-space-sm) var(--rt-space-sm) 0;
70
+ text-overflow: ellipsis;
71
+ white-space: nowrap;
72
+ }
73
+
74
+ &__copy-button {
75
+ position: absolute;
76
+ transition: visibility var(--rt-data-table-cell-transition-duration) linear;
77
+ visibility: hidden;
78
+
79
+ // Постоянно видна там, где наведения нет, — а не по ширине окна: у первого кита она
80
+ // появлялась сама только на телефоне, а порог узкого экрана второго кита 1080px, и на
81
+ // ноутбуке с боковой панелью кнопки стояли во всех ячейках сразу.
82
+ @media (hover: none) {
83
+ visibility: visible;
84
+ }
85
+
86
+ // Вид — через кнопки списка: материальный набор рисует плашку первого кита.
87
+ --rt-icon-button-color: var(--rt-list-copy-button-color);
88
+
89
+ .rt-icon-button {
90
+ --rt-icon-button-size: var(--rt-list-copy-button-size);
91
+ --rt-icon-button-square-radius: var(--rt-list-copy-button-radius);
92
+ --rt-icon-button-color-hover: var(--rt-color-text-primary);
93
+ --rt-icon-button-color-bg-hover: var(--rt-list-copy-button-bg-hover);
94
+
95
+ background-color: var(--rt-list-copy-button-bg);
96
+ }
97
+
98
+ &--position--left {
99
+ left: var(--rt-space-xs);
100
+ }
101
+
102
+ &--position--right {
103
+ right: var(--rt-space-xs);
104
+ }
105
+
106
+ &--complete {
107
+ cursor: not-allowed;
108
+ }
109
+
110
+ &--visible {
111
+ visibility: visible;
112
+ }
113
+ }
114
+ }
115
+ }
@@ -0,0 +1,51 @@
1
+ @layer rt-kit.components {
2
+ /* rt-data-table-filter-cell — ячейка строки отбора первого кита: кнопка вида сравнения или
3
+ очистки, за ней поле во всю оставшуюся ширину. Промежуток 8px — ступень sm. Длинное значение
4
+ не выходит за ячейку: поле кита сжимается и режет текст само. */
5
+
6
+ .rt-data-table-filter-cell {
7
+ display: flex;
8
+ width: 100%;
9
+ align-items: center;
10
+ justify-content: flex-start;
11
+ gap: var(--rt-space-sm);
12
+
13
+ // Поле отбора первого кита — то же обведённое поле Material, что поиск списка, и берёт его
14
+ // имена: материальный набор даёт ему 52px, шрифт 16px и цвета темы, свой вид — малое поле.
15
+ &__field {
16
+ --rt-input-height-sm: var(--rt-list-search-height);
17
+ --rt-input-font-size: var(--rt-list-search-font-size);
18
+ --rt-input-color-border: var(--rt-list-search-color-border);
19
+ --rt-input-color-bg: var(--rt-list-search-color-bg);
20
+ --rt-input-color-text-placeholder: var(--rt-list-search-color-placeholder);
21
+ --rt-input-line-height: var(--rt-list-filter-line-height);
22
+
23
+ min-width: 0;
24
+ flex-grow: 1;
25
+ }
26
+
27
+ // Желаемая ширина поля первого кита: середина поля Material — 180px, по краям поля 16px.
28
+ // По ней таблица делит строку между колонками; места меньше — поле сжимается, как там.
29
+ // Правило идёт от ячейки к полю: поле само ставит себе ширину 100% тем же весом селектора,
30
+ // и спор решал бы порядок, в котором страница подключила стили компонентов.
31
+ & &__field {
32
+ width: calc(180px + 2 * var(--rt-space-4));
33
+ }
34
+
35
+ // Кнопки вида сравнения и очистки берут размер, форму и цвет кнопок таблицы: материальный
36
+ // набор рисует их, как первый кит, свой вид оставляет прежними.
37
+ rt-icon-button {
38
+ --rt-icon-button-color: var(--rt-list-table-icon-color);
39
+ }
40
+
41
+ .rt-icon-button {
42
+ --rt-icon-button-size: var(--rt-list-table-button-size);
43
+ --rt-icon-button-square-radius: var(--rt-list-table-button-radius);
44
+ }
45
+
46
+ .rt-icon-button__icon {
47
+ min-width: var(--rt-list-table-icon-size);
48
+ min-height: var(--rt-list-table-icon-size);
49
+ }
50
+ }
51
+ }
@@ -0,0 +1,111 @@
1
+ @layer rt-kit.components {
2
+ /* rt-data-table-header-cell — ячейка шапки таблицы первого кита. Размеры первого кита лежат на
3
+ шкале: промежуток 8px — ступень sm, отступ стрелок 16px — ступень md, значок 24px — размер lg
4
+ набора. Стрелки порядка — два треугольника первого кита: бока 3px — ступень толстой
5
+ рамки, высота 5.2px округлена к ступени габарита 4px, зазор между ними — ступень 2xs. */
6
+
7
+ .rt-data-table-header-cell {
8
+ --rt-data-table-header-cell-arrow-side: var(--rt-border-width-thick);
9
+ --rt-data-table-header-cell-arrow-height: var(--rt-size-1);
10
+ --rt-data-table-header-cell-focus-shadow: var(--rt-shadow-focus-ring);
11
+
12
+ display: flex;
13
+ align-items: center;
14
+ justify-content: space-between;
15
+ cursor: pointer;
16
+
17
+ // Фокус с клавиатуры показывает то же, что наведение: стрелки порядка и кольцо фокуса.
18
+ &:hover .rt-data-table-header-cell__arrows,
19
+ &:focus-visible .rt-data-table-header-cell__arrows {
20
+ visibility: visible;
21
+ }
22
+
23
+ &:focus-visible {
24
+ box-shadow: var(--rt-data-table-header-cell-focus-shadow);
25
+ outline: none;
26
+ }
27
+
28
+ &__label {
29
+ display: flex;
30
+ flex-grow: 1;
31
+ align-items: center;
32
+ gap: var(--rt-space-sm);
33
+
34
+ &--align--left {
35
+ justify-content: flex-start;
36
+ }
37
+
38
+ &--align--center {
39
+ justify-content: center;
40
+ }
41
+
42
+ &--align--right {
43
+ justify-content: flex-end;
44
+ }
45
+ }
46
+
47
+ &__prefix,
48
+ &__suffix {
49
+ display: inline-flex;
50
+ min-width: fit-content;
51
+ }
52
+
53
+ /* Глиф Material Symbols для имени без пары — лигатура шрифта, который подключает
54
+ приложение; размер 24px — размер lg значка кита, как у ячейки. */
55
+ &__glyph {
56
+ display: inline-block;
57
+ overflow: hidden;
58
+ width: var(--rt-size-6);
59
+ font-family: 'Material Symbols Outlined', sans-serif;
60
+ font-feature-settings: 'liga';
61
+ font-size: var(--rt-size-6);
62
+ font-style: normal;
63
+ font-weight: var(--rt-font-weight-regular);
64
+ letter-spacing: normal;
65
+ line-height: 1;
66
+ text-transform: none;
67
+ white-space: nowrap;
68
+
69
+ &--filled {
70
+ font-variation-settings: 'FILL' 1;
71
+ }
72
+ }
73
+
74
+ /* Подпись длиннее места обрезается многоточием; целиком её читают в подсказке колонки. */
75
+ &__text {
76
+ overflow: hidden;
77
+ text-overflow: ellipsis;
78
+ white-space: nowrap;
79
+ }
80
+
81
+ &__arrows {
82
+ display: flex;
83
+ flex-direction: column;
84
+ align-items: center;
85
+ justify-content: center;
86
+ margin-left: var(--rt-space-md);
87
+ visibility: hidden;
88
+
89
+ &--active {
90
+ visibility: visible;
91
+ }
92
+ }
93
+
94
+ &__arrow {
95
+ width: 0;
96
+ height: 0;
97
+ border-right: var(--rt-data-table-header-cell-arrow-side) solid transparent;
98
+ border-bottom: var(--rt-data-table-header-cell-arrow-height) solid var(--rt-color-text-muted);
99
+ border-left: var(--rt-data-table-header-cell-arrow-side) solid transparent;
100
+
101
+ &--second {
102
+ margin-top: var(--rt-space-2xs);
103
+ transform: scaleY(-1);
104
+ }
105
+
106
+ &--active {
107
+ border-bottom-color: var(--rt-color-text-primary);
108
+ }
109
+ }
110
+ }
111
+ }
@@ -0,0 +1,263 @@
1
+ @layer rt-kit.components {
2
+ /* rt-data-table — таблица первого кита во втором. Размеры первого кита положены на шкалу:
3
+ высота строки 48px — ступень роста контрола lg, поля ячейки 10px собраны из ступеней 2 и 0-5,
4
+ место под полосу действий 64px — ступень 3xl, поля ячейки отбора 4px и 8px — ступени xs и
5
+ sm. Подпись шапки 16px — ступень md при межстрочном tight, значение строки 14px — sm.
6
+ Шапка стоит над строками ярусом sticky шкалы, полоса действий — ярусом base: она в
7
+ разметке идёт после ячеек и потому рисуется поверх них. */
8
+
9
+ .rt-data-table {
10
+ --rt-data-table-row-height: var(--rt-control-height-lg);
11
+ --rt-data-table-head-height: calc(var(--rt-control-height-lg) - var(--rt-space-1));
12
+ --rt-data-table-border-width: var(--rt-border-width-thin);
13
+ --rt-data-table-cell-padding: calc(var(--rt-space-2) + var(--rt-space-0-5));
14
+ --rt-data-table-row-transition-duration: var(--rt-duration-base);
15
+
16
+ /* Нижний отступ списка стоит внутри прокрутки: таблица и есть область прокрутки. */
17
+ --rt-data-table-padding-bottom: var(--rt-list-content-padding-bottom);
18
+
19
+ /* Шапку перекрашивает приложение, как в первом ките: цвет и насыщенность подписи, фон
20
+ строки отбора. Фон строки отбора, как в первом ките, считается от фона шапки: половина
21
+ шапки, половина поверхности — перекрашенная шапка тянет строку отбора за собой. */
22
+ --rt-data-table-head-color: var(--rt-color-text-primary);
23
+ --rt-data-table-head-font-weight: var(--rt-font-weight-medium);
24
+ --rt-data-table-filter-bg: color-mix(in srgb, var(--rt-color-table-head-bg), var(--rt-color-bg-surface) 50%);
25
+
26
+ display: block;
27
+ overflow: auto;
28
+ width: 100%;
29
+ height: 100%;
30
+ box-sizing: border-box;
31
+ padding-bottom: var(--rt-data-table-padding-bottom);
32
+
33
+ /* Стандартные свойства полосы тоже приходят с корня. Chrome при заданном стандартном
34
+ свойстве не читает `::-webkit-scrollbar`, и нулевой размер оттуда полосу не прятал: список
35
+ ставит `none`, когда скрыты обе полосы, и `auto`, когда одна. Без его выбора — тихая
36
+ полоса основы кита, повторённая здесь с теми же приметами наведения и фокуса. */
37
+ scrollbar-color: var(--rt-data-table-scrollbar-color, transparent transparent);
38
+ scrollbar-width: var(--rt-data-table-scrollbar-width, thin);
39
+
40
+ /* Размер полос прокрутки приходит с корня страницы: туда его ставит список по
41
+ сохранённой настройке. Своего объявления на блоке нет намеренно — оно победило бы
42
+ унаследованное, и выбор человека до таблицы не дошёл бы. Без списка полосы кита
43
+ обычные: запасное значение — та же ступень, что в основе. */
44
+ &::-webkit-scrollbar {
45
+ width: var(--rt-data-table-scrollbar-vertical-width, var(--rt-size-3));
46
+ height: var(--rt-data-table-scrollbar-horizontal-height, var(--rt-size-3));
47
+ }
48
+
49
+ &:hover,
50
+ &:focus-within {
51
+ scrollbar-color: var(--rt-data-table-scrollbar-color, var(--rt-color-border-default) transparent);
52
+ }
53
+
54
+ @media (hover: none) {
55
+ scrollbar-color: var(--rt-data-table-scrollbar-color, var(--rt-color-border-default) transparent);
56
+ }
57
+
58
+ &__table {
59
+ width: 100%;
60
+ border-collapse: collapse;
61
+ }
62
+
63
+ thead {
64
+ position: sticky;
65
+ z-index: var(--rt-z-sticky);
66
+ top: 0;
67
+
68
+ /* Шапка первого кита — 44px: ступени такой нет, и она собрана из ступени lg без ступени 1.
69
+ Высоту держит строка, а не поля ячейки: поля первого кита 10px на шкалу не ложатся. */
70
+ tr:first-child {
71
+ height: var(--rt-data-table-head-height);
72
+ }
73
+
74
+ tr:last-child {
75
+ border-bottom: var(--rt-data-table-border-width) solid var(--rt-color-border-default);
76
+ }
77
+ }
78
+
79
+ tbody {
80
+ font-size: var(--rt-text-sm);
81
+ }
82
+
83
+ &__row {
84
+ height: var(--rt-data-table-row-height);
85
+ border-bottom: var(--rt-data-table-border-width) solid var(--rt-color-border-subtle);
86
+ color: var(--rt-color-text-primary);
87
+ transform: translate(0);
88
+
89
+ &:hover {
90
+ border-bottom-color: var(--rt-color-state-info);
91
+ transition: border-bottom-color var(--rt-data-table-row-transition-duration);
92
+ }
93
+
94
+ &:hover .rt-data-table-actions {
95
+ visibility: visible;
96
+ }
97
+
98
+ &--active {
99
+ border-bottom-color: var(--rt-color-state-info);
100
+ }
101
+
102
+ &--clickable {
103
+ cursor: pointer;
104
+ }
105
+ }
106
+
107
+ /* Ячейка шапки не ловит указатель вовсе: у первого кита нажимаются только сортируемая
108
+ ячейка, ячейка отбора и ячейка выбора. */
109
+ &__cell {
110
+ width: fit-content;
111
+ height: 100%;
112
+ padding: var(--rt-data-table-cell-padding);
113
+
114
+ &--head {
115
+ position: relative;
116
+ background-color: var(--rt-color-table-head-bg);
117
+ color: var(--rt-data-table-head-color);
118
+ font-size: var(--rt-text-md);
119
+ font-weight: var(--rt-data-table-head-font-weight);
120
+ line-height: var(--rt-leading-tight);
121
+ pointer-events: none;
122
+ text-align: start;
123
+ }
124
+
125
+ &--sortable,
126
+ &--selectable,
127
+ &--filterable {
128
+ pointer-events: auto;
129
+ }
130
+
131
+ /* Чекбокс и радиокнопка — строчные хосты: в строке текста они встают на базовую линию,
132
+ и место под выносными поднимает их на 2px над серединой ячейки. Блочный хост строки
133
+ текста не заводит, и ячейка ставит его по своей середине. */
134
+ &--selectable > rt-checkbox,
135
+ &--selectable > rt-radio-button {
136
+ display: flex;
137
+ }
138
+
139
+ &--filterable {
140
+ padding: var(--rt-space-xs) var(--rt-space-sm);
141
+ background-color: var(--rt-data-table-filter-bg);
142
+ }
143
+
144
+ /* Поля отбора первого кита — обведённые поля Material со скруглением 4px, а не
145
+ скругление контрола материального набора: то круглее, и поля выходили таблетками. */
146
+ :is(.rt-preset-material, [data-preset='material']) &--filterable {
147
+ --rt-input-radius: var(--rt-radius-sm);
148
+ }
149
+
150
+ /* Разделитель между ячейками шапки — полоса в половину высоты, как у первого кита. Цвет —
151
+ имя таблицы списка: материальный набор берёт его из темы Material, иначе под тёмной
152
+ темой Material разделитель сливается с фоном шапки. */
153
+ &--head:not(:last-child, .rt-data-table__cell--selectable, .rt-data-table__cell--empty):after {
154
+ position: absolute;
155
+ top: 25%;
156
+ right: 0;
157
+ height: 50%;
158
+ border-right: var(--rt-data-table-border-width) solid var(--rt-list-table-head-divider-color);
159
+ content: '';
160
+ pointer-events: none;
161
+ }
162
+
163
+ /* Место под полосу действий: ширину ячейке ставит сама таблица по ширине полосы. */
164
+ &--spacer {
165
+ padding: 0;
166
+ }
167
+ }
168
+ }
169
+
170
+ /* Полоса действий висит над концом строки и проявляется наведением; там, где наведения нет,
171
+ она видна всегда. Левый край растворяется в фоне — приём первого кита. */
172
+ // Полоса действий занимает строку целиком: строка с картинкой или длинной подписью выше обычной,
173
+ // и полоса высотой в обычную строку оставляла её низ открытым.
174
+ // Фон полосы — ручка приложения `--rt-table-actions-bg`, как
175
+ // `--rt-table-actions-container-background-color` первого кита: полоса стоит на фоне строки, а
176
+ // фон строки приложение задаёт своим. Без ручки полоса берёт фон поверхности.
177
+ .rt-data-table-actions {
178
+ --rt-data-table-actions-bg: var(--rt-table-actions-bg, var(--rt-color-bg-surface));
179
+
180
+ position: absolute;
181
+ z-index: var(--rt-z-base);
182
+ top: 0;
183
+ right: 0;
184
+ display: flex;
185
+ width: 100%;
186
+ height: 100%;
187
+ align-items: center;
188
+ justify-content: flex-end;
189
+ pointer-events: none;
190
+
191
+ &__container {
192
+ position: sticky;
193
+ right: 0;
194
+ display: flex;
195
+ overflow: hidden;
196
+ width: fit-content;
197
+ height: calc(100% - var(--rt-data-table-border-width) * 2);
198
+ align-items: center;
199
+ justify-content: flex-end;
200
+ padding: 0 var(--rt-space-xs) 0 var(--rt-space-5);
201
+ background: linear-gradient(
202
+ to right,
203
+ transparent 0%,
204
+ color-mix(in srgb, var(--rt-data-table-actions-bg) 30%, transparent) 10%,
205
+ var(--rt-data-table-actions-bg) 20%,
206
+ var(--rt-data-table-actions-bg) 100%
207
+ );
208
+ gap: var(--rt-space-xs);
209
+ pointer-events: none;
210
+ }
211
+
212
+ /* Сама полоса указателя не ловит — нажатие сквозь неё доходит до строки; ловят его
213
+ кнопки, которые в ней стоят: и меню строки, и действия приложения рядом с ним. */
214
+ &__container > * {
215
+ pointer-events: auto;
216
+ }
217
+
218
+ &__action {
219
+ position: sticky;
220
+ }
221
+
222
+ // Действия строки — меню кита и кнопки приложения — берут размер, форму и цвет кнопок таблицы.
223
+ rt-icon-button {
224
+ --rt-icon-button-color: var(--rt-list-table-icon-color);
225
+ }
226
+
227
+ .rt-icon-button {
228
+ --rt-icon-button-size: var(--rt-list-table-button-size);
229
+ --rt-icon-button-square-radius: var(--rt-list-table-button-radius);
230
+ }
231
+
232
+ .rt-icon-button__icon {
233
+ min-width: var(--rt-list-table-icon-size);
234
+ min-height: var(--rt-list-table-icon-size);
235
+ }
236
+
237
+ /* Полоса прячется прозрачностью, а не `visibility`: скрытая так кнопка остаётся в порядке
238
+ обхода, и фокус с клавиатуры до неё доходит — фокус с клавиатуры внутри строки полосу и
239
+ показывает. Фокус после мыши — не повод: меню строки, закрывшись, возвращает фокус на
240
+ свою кнопку, нажатие ставит его на флажок строки, и полоса, открытая по `:focus-within`,
241
+ висела бы над строкой, от которой указатель давно ушёл. Нажатий прозрачная полоса не
242
+ ловит, пока её не видно. */
243
+ @media (hover: hover) {
244
+ &--hidden {
245
+ opacity: 0;
246
+ }
247
+
248
+ &--hidden &__container > * {
249
+ pointer-events: none;
250
+ }
251
+
252
+ .rt-data-table__row:hover &--hidden,
253
+ .rt-data-table__row:has(:focus-visible) &--hidden {
254
+ opacity: 1;
255
+ }
256
+
257
+ .rt-data-table__row:hover &--hidden &__container > *,
258
+ .rt-data-table__row:has(:focus-visible) &--hidden &__container > * {
259
+ pointer-events: auto;
260
+ }
261
+ }
262
+ }
263
+ }
@@ -1,5 +1,7 @@
1
1
  @layer rt-kit.components {
2
2
  .rt-date-picker {
3
+ --rt-date-picker-fill-radius: var(--rt-radius-sm);
4
+
3
5
  position: relative;
4
6
  display: inline-flex;
5
7
  width: 100%;
@@ -30,6 +32,17 @@
30
32
  border-color: transparent;
31
33
  }
32
34
 
35
+ /* Вид «fill» — залитое поле с чертой снизу, как у материального поля первого кита: скругление
36
+ у него своё и малое — скругление поля бывает «таблеткой», а у залитого поля низ прямой.
37
+ Объявлен до блоков состояний: фокус, ошибка и «только чтение» идут ниже и
38
+ перекрывают его рамку. */
39
+ &--appearance--fill {
40
+ border-color: transparent;
41
+ border-radius: var(--rt-date-picker-fill-radius) var(--rt-date-picker-fill-radius) 0 0;
42
+ border-bottom-color: var(--rt-color-field-fill-underline);
43
+ background-color: var(--rt-color-bg-surface-subtle-2);
44
+ }
45
+
33
46
  &--invalid {
34
47
  border-color: var(--rt-input-color-border-error);
35
48