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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/README.md +87 -7
  2. package/fesm2022/rt-tools-ui-kit-v2.mjs +1929 -994
  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.7.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/CONTEXT.md +16 -10
  42. package/src/lib/components/icon/rt-icon.component.scss +14 -12
  43. package/src/lib/components/icon-button/CONTEXT.md +4 -2
  44. package/src/lib/components/icon-button/rt-icon-button.component.scss +128 -112
  45. package/src/lib/components/info-item/rt-info-item.component.scss +38 -36
  46. package/src/lib/components/input/CONTEXT.md +9 -7
  47. package/src/lib/components/input/rt-input.component.scss +102 -98
  48. package/src/lib/components/input-number/rt-input-number.component.scss +84 -82
  49. package/src/lib/components/live-badge/rt-live-badge.component.scss +27 -23
  50. package/src/lib/components/logo/rt-logo.component.scss +54 -52
  51. package/src/lib/components/markdown-text/CONTEXT.md +40 -0
  52. package/src/lib/components/markdown-text/rt-markdown-text.component.scss +130 -0
  53. package/src/lib/components/menu/rt-menu-confirm-dialog.component.scss +30 -28
  54. package/src/lib/components/menu/rt-menu-item.component.scss +47 -42
  55. package/src/lib/components/menu/rt-menu.component.scss +23 -15
  56. package/src/lib/components/message/rt-message.component.scss +53 -49
  57. package/src/lib/components/message-composer/CONTEXT.md +1 -1
  58. package/src/lib/components/message-composer/rt-message-composer.component.scss +55 -49
  59. package/src/lib/components/money-list/rt-money-list.component.scss +13 -9
  60. package/src/lib/components/money-list/rt-money-row.component.scss +23 -19
  61. package/src/lib/components/multiselect/rt-multiselect.component.scss +169 -161
  62. package/src/lib/components/night-grid/rt-night-grid.component.scss +47 -42
  63. package/src/lib/components/note/rt-note.component.scss +15 -11
  64. package/src/lib/components/notifications-bell/rt-notifications-bell.component.scss +34 -27
  65. package/src/lib/components/page-header/rt-page-header-mobile.scss +142 -134
  66. package/src/lib/components/page-header/rt-page-header-submenu.scss +130 -123
  67. package/src/lib/components/page-header/rt-page-header.component.scss +221 -210
  68. package/src/lib/components/pagination/rt-pagination.component.scss +88 -81
  69. package/src/lib/components/photo-viewer/rt-photo-viewer.component.scss +109 -105
  70. package/src/lib/components/rich-editor/CONTEXT.md +1 -1
  71. package/src/lib/components/rich-editor/rt-rich-editor.component.scss +63 -59
  72. package/src/lib/components/section-nav/rt-section-nav.component.scss +53 -47
  73. package/src/lib/components/select/rt-select.component.scss +146 -138
  74. package/src/lib/components/skeleton/rt-skeleton.component.scss +50 -41
  75. package/src/lib/components/skeleton-wrapper/rt-skeleton-wrapper.component.scss +8 -6
  76. package/src/lib/components/spinner/rt-spinner.component.scss +35 -32
  77. package/src/lib/components/split-button/rt-split-button.component.scss +74 -62
  78. package/src/lib/components/stat-tile/rt-stat-tile.component.scss +95 -91
  79. package/src/lib/components/stepper/rt-stepper.component.scss +107 -101
  80. package/src/lib/components/table/copy-cell/rt-copy-cell.component.scss +39 -30
  81. package/src/lib/components/table/rt-table.component.scss +260 -252
  82. package/src/lib/components/table/settings-aside/rt-table-settings-aside.component.scss +7 -5
  83. package/src/lib/components/table/settings-panel/rt-table-settings-panel.component.scss +71 -61
  84. package/src/lib/components/table/sort-header/rt-table-sort-header.component.scss +31 -29
  85. package/src/lib/components/tabs/rt-tabs.component.scss +184 -175
  86. package/src/lib/components/tag/rt-tag.component.scss +97 -92
  87. package/src/lib/components/textarea/rt-textarea.component.scss +62 -60
  88. package/src/lib/components/theme-toggle/rt-theme-toggle.component.scss +7 -5
  89. package/src/lib/components/thread-list/rt-thread-list.component.scss +221 -212
  90. package/src/lib/components/timeline/rt-timeline.component.scss +82 -76
  91. package/src/lib/components/toast/rt-toast.component.scss +169 -160
  92. package/src/lib/components/toast/rt-toaster.component.scss +37 -35
  93. package/src/lib/components/toggle-button-group/rt-toggle-button-group.component.scss +129 -122
  94. package/src/lib/components/toggle-switch/rt-toggle-switch.component.scss +97 -91
  95. package/src/lib/components/toolbar/rt-toolbar.component.scss +63 -54
  96. package/src/lib/components/tooltip/rt-tooltip.component.scss +24 -15
  97. package/src/lib/components/welcome-dialog/rt-welcome-dialog.component.scss +46 -44
  98. package/src/lib/components/workspace/rt-workspace.component.scss +139 -131
  99. package/src/lib/components/workspace-details/rt-workspace-details.component.scss +105 -101
  100. package/src/styles/_index.scss +11 -0
  101. package/src/styles/_layers.scss +22 -0
  102. package/src/styles/_login.scss +87 -85
  103. package/src/styles/_mixins.scss +1 -1
  104. package/src/styles/_primitives.scss +138 -66
  105. package/src/styles/_scrollbar.scss +21 -19
  106. package/src/styles/_semantic.scss +155 -62
  107. package/src/styles/_theme-dark-rules.scss +23 -0
  108. package/src/styles/_theme-dark.scss +61 -42
  109. package/styles/tokens.css +754 -418
  110. package/types/rt-tools-ui-kit-v2.d.ts +292 -103
  111. package/rt-tools-ui-kit-v2-0.5.0.tgz +0 -0
@@ -1,4 +1,7 @@
1
- /* Semantic design tokens — light defaults.
1
+ /* Собрано генератором `tools/build-tokens-v2.mjs` из `tokens.source.mjs` — правится там, не здесь:
2
+ правка на месте теряется на следующей сборке, и её называет `pnpm run check:tokens-build`. */
3
+
4
+ /* Назначения светлой темы.
2
5
 
3
6
  Тело вынесено в @mixin по той же причине, что и у тёмной темы: набор нужен не
4
7
  только на `:root`, но и на отдельном контейнере. Без этого светлую половину
@@ -9,46 +12,131 @@
9
12
  /* Background */
10
13
  --rt-color-bg-page: var(--rt-neutral-50);
11
14
  --rt-color-bg-surface: var(--rt-neutral-0);
12
- --rt-color-bg-surface-subtle: var(--rt-neutral-100);
15
+ --rt-color-bg-surface-subtle: var(--rt-overlay-black-4);
13
16
  --rt-color-bg-surface-subtle-2: var(--rt-neutral-200);
14
- --rt-color-bg-hover: var(--rt-neutral-100);
17
+ --rt-color-bg-hover: var(--rt-overlay-black-4);
15
18
  --rt-color-bg-subtle: var(--rt-neutral-100);
16
19
  --rt-color-bg-overlay: var(--rt-overlay-black-50);
17
20
  --rt-color-bg-inverse: var(--rt-neutral-900);
18
21
 
22
+ /* Подложка обвязки — шапка и боковая навигация. Отдельно от bg-inverse: тот
23
+ нейтральный и работает под перевёрнутым текстом, а этот синеватый и в обеих
24
+ темах один. */
25
+ --rt-color-bg-nav: var(--rt-navy-900); /* rt-theme-shared: обвязка тёмная в обеих темах */
26
+
19
27
  /* Text */
20
28
  --rt-color-text-primary: var(--rt-neutral-900);
21
- --rt-color-text-muted: var(--rt-neutral-500);
29
+
30
+ /* Ступень 600, а не 500: приглушённый текст обязан брать порог, а после
31
+ пересчёта ряда самая светлая ступень, которая его берёт, — шестисотая.
32
+ Прежде эту роль держала off-grid ступень 510, заведённая ровно под неё.
33
+
34
+ Тёмный ответ — пятьдесят процентов белого, а не сорок: на сорока он давал
35
+ 3.6:1 над поверхностью, 3.7:1 над страницей и 3.7:1 над фоном поля, то есть
36
+ не брал порога ни над одной подложкой. Светлую сторону под порог подводили,
37
+ тёмную забыли, и держал её список принятого. Пятьдесят — самая слабая доля,
38
+ берущая порог над всеми тремя: 4.86, 5.02 и 5.09. */
39
+ --rt-color-text-muted: var(--rt-neutral-600);
22
40
  --rt-color-text-disabled: var(--rt-neutral-400);
23
41
  --rt-color-text-inverse: var(--rt-neutral-0);
24
- --rt-color-text-link: var(--rt-blue-500);
25
- --rt-color-text-link-hover: var(--rt-blue-600);
42
+ --rt-color-text-link: var(--rt-brand-500);
43
+ --rt-color-text-link-hover: var(--rt-brand-600);
26
44
 
27
45
  /* Border */
28
- --rt-color-border-default: var(--rt-neutral-200);
46
+ --rt-color-border-default: var(--rt-neutral-100);
29
47
  --rt-color-border-strong: var(--rt-neutral-300);
30
- --rt-color-border-subtle: var(--rt-neutral-200);
31
- --rt-color-border-focus: var(--rt-blue-500);
32
-
33
- /* Action */
34
- --rt-color-action-primary: var(--rt-blue-500);
35
- --rt-color-action-primary-hover: var(--rt-blue-600);
36
- --rt-color-action-primary-subtle: var(--rt-overlay-blue-8);
48
+ --rt-color-border-subtle: var(--rt-neutral-100);
49
+ --rt-color-border-focus: var(--rt-brand-500);
50
+
51
+ /* Action — роли действия.
52
+
53
+ Роль это пятёрка: подложка, наведение, нажатие, подпись на них и цвет самой
54
+ роли на поверхности. Кнопка берёт роль целиком и своих цветов не знает вовсе,
55
+ поэтому смена роли — одна строка здесь, а не правка стилей компонента.
56
+ Наведение и нажатие — соседние ступени своей шкалы; подпись светлая у всех
57
+ ролей, потому что все подложки тёмные.
58
+
59
+ Пятый член — `-on-surface` — красит безфоновые оформления: текстовое и
60
+ обводочное берут им подпись и рамку. Отдельным именем, а не подложкой роли:
61
+ подложка вправе быть поверхностью, и у вторичной роли на графите она ею
62
+ становится — подпись, взятая из подложки, легла бы сама на себя. У пяти ролей
63
+ цвет тот же, что и у подложки, и это записано ссылкой, а не повтором
64
+ значения. */
65
+ --rt-color-action-primary: var(--rt-brand-500); /* rt-theme-shared: цвет марки один в обеих темах */
66
+ --rt-color-action-primary-hover: var(--rt-brand-600); /* rt-theme-shared: цвет марки один в обеих темах */
67
+ --rt-color-action-primary-active: var(--rt-brand-700); /* rt-theme-shared: цвет марки один в обеих темах */
68
+ --rt-color-action-primary-subtle: var(--rt-overlay-brand-8);
37
69
 
38
70
  /* Focus-ring tint — насыщеннее subtle, для visible 3px outline. */
39
- --rt-color-action-primary-soft: var(--rt-overlay-blue-24);
40
- --rt-color-action-on-primary: var(--rt-neutral-0);
41
- --rt-color-action-secondary: var(--rt-neutral-200);
42
- --rt-color-action-on-secondary: var(--rt-neutral-900);
71
+ --rt-color-action-primary-soft: var(--rt-overlay-brand-24);
72
+ --rt-color-action-on-primary: var(--rt-neutral-0); /* rt-theme-shared: подпись на действии марки светлая в обеих темах */
73
+ --rt-color-action-primary-on-surface: var(--rt-color-action-primary);
74
+
75
+ /* Вторичное действие — единственная роль без своего цвета: она нейтральна и на
76
+ графите разворачивается в подложку поверхности, поэтому тёмная тема отвечает
77
+ на всю её тройку. По той же причине пятый член у неё свой: подложкой роли на
78
+ графите красить подпись нечем. */
79
+ --rt-color-action-secondary: var(--rt-neutral-600);
80
+ --rt-color-action-secondary-hover: var(--rt-neutral-700);
81
+ --rt-color-action-secondary-active: var(--rt-neutral-800);
82
+ --rt-color-action-on-secondary: var(--rt-neutral-0);
83
+ --rt-color-action-secondary-on-surface: var(--rt-neutral-600);
84
+ --rt-color-action-success: var(--rt-success-500); /* rt-theme-shared: цвет роли один в обеих темах */
85
+ --rt-color-action-success-hover: var(--rt-success-600); /* rt-theme-shared: цвет роли один в обеих темах */
86
+ --rt-color-action-success-active: var(--rt-success-700); /* rt-theme-shared: цвет роли один в обеих темах */
87
+ --rt-color-action-on-success: var(--rt-neutral-0); /* rt-theme-shared: подпись на цветной подложке светлая в обеих темах */
88
+ --rt-color-action-success-on-surface: var(--rt-color-action-success);
89
+ --rt-color-action-warning: var(--rt-warning-500); /* rt-theme-shared: цвет роли один в обеих темах */
90
+ --rt-color-action-warning-hover: var(--rt-warning-600); /* rt-theme-shared: цвет роли один в обеих темах */
91
+ --rt-color-action-warning-active: var(--rt-warning-700); /* rt-theme-shared: цвет роли один в обеих темах */
92
+ --rt-color-action-on-warning: var(--rt-neutral-0); /* rt-theme-shared: подпись на цветной подложке светлая в обеих темах */
93
+ --rt-color-action-warning-on-surface: var(--rt-color-action-warning);
94
+ --rt-color-action-danger: var(--rt-danger-500); /* rt-theme-shared: цвет роли один в обеих темах */
95
+ --rt-color-action-danger-hover: var(--rt-danger-600); /* rt-theme-shared: цвет роли один в обеих темах */
96
+ --rt-color-action-danger-active: var(--rt-danger-700); /* rt-theme-shared: цвет роли один в обеих темах */
97
+ --rt-color-action-on-danger: var(--rt-neutral-0); /* rt-theme-shared: подпись на цветной подложке светлая в обеих темах */
98
+ --rt-color-action-danger-on-surface: var(--rt-color-action-danger);
99
+ --rt-color-action-info: var(--rt-info-500); /* rt-theme-shared: цвет роли один в обеих темах */
100
+ --rt-color-action-info-hover: var(--rt-info-600); /* rt-theme-shared: цвет роли один в обеих темах */
101
+ --rt-color-action-info-active: var(--rt-info-700); /* rt-theme-shared: цвет роли один в обеих темах */
102
+ --rt-color-action-on-info: var(--rt-neutral-0); /* rt-theme-shared: подпись на цветной подложке светлая в обеих темах */
103
+ --rt-color-action-info-on-surface: var(--rt-color-action-info);
104
+
105
+ /* Отключённое действие — своя пара, а не вторичная роль: делить подложку с ней
106
+ значит сделать отключённую вторичную кнопку неотличимой от доступной. */
107
+ --rt-color-action-disabled: var(--rt-neutral-200);
108
+ --rt-color-action-on-disabled: var(--rt-color-text-disabled);
109
+
110
+ /* Доли оттенка под наведение и нажатие безфоновых оформлений кнопки. Живут в
111
+ слое, а не в стилях компонента: тёмная тема их поднимает, а половина пары,
112
+ оставшаяся в компоненте, тёмному ответу не видна. */
113
+ --rt-btn-tint-hover: 8%;
114
+ --rt-btn-tint-active: 16%;
115
+
116
+ /* Кольцо фокуса разобрано на составляющие: толщину, отступ и цвет. Композит
117
+ собирается из них и остаётся на месте — восемь компонентов берут его целиком, и
118
+ менять их незачем. Отступ — зазор цвета поверхности между элементом и кольцом:
119
+ первая тень при нулевом отступе не рисует ничего. */
120
+ --rt-focus-ring-width: var(--rt-border-width-thick);
121
+
122
+ /* Ноль с единицей намеренно: безразмерный ноль внутри calc с длиной невалиден, и
123
+ браузер отбрасывает объявление кольца целиком — кольцо просто пропадает. */
124
+ --rt-focus-ring-offset: 0px;
125
+ --rt-focus-ring-color: var(--rt-color-action-primary-soft);
126
+ --rt-focus-ring-color-danger: var(--rt-overlay-danger-16); /* rt-theme-shared: оттенок опасного действия один в обеих темах */
43
127
 
44
128
  /* Focus-ring composite — для interactive элементов с custom focus-visible. */
45
- --rt-shadow-focus-ring: 0 0 0 3px var(--rt-color-action-primary-soft);
46
- --rt-shadow-focus-ring-danger: 0 0 0 3px var(--rt-overlay-danger-16);
129
+ --rt-shadow-focus-ring:
130
+ 0 0 0 var(--rt-focus-ring-offset) var(--rt-color-bg-surface),
131
+ 0 0 0 calc(var(--rt-focus-ring-offset) + var(--rt-focus-ring-width)) var(--rt-focus-ring-color);
132
+ --rt-shadow-focus-ring-danger:
133
+ 0 0 0 var(--rt-focus-ring-offset) var(--rt-color-bg-surface),
134
+ 0 0 0 calc(var(--rt-focus-ring-offset) + var(--rt-focus-ring-width)) var(--rt-focus-ring-color-danger);
47
135
 
48
136
  /* Stepper (rt-stepper) — рельса прогресса. Текущий шаг — янтарный (одинаков
49
137
  в обеих темах); трек/прогресс переопределяются в dark на приглушённые. */
50
- --rt-color-stepper-current: var(--rt-amber-400);
51
- --rt-color-stepper-current-subtle: var(--rt-overlay-amber-16);
138
+ --rt-color-stepper-current: var(--rt-amber-400); /* rt-theme-shared: янтарь текущего шага один в обеих темах */
139
+ --rt-color-stepper-current-subtle: var(--rt-overlay-amber-16); /* rt-theme-shared: янтарь текущего шага один в обеих темах */
52
140
  --rt-color-stepper-track: var(--rt-gray-350);
53
141
  --rt-color-stepper-progress: var(--rt-color-action-primary);
54
142
 
@@ -59,32 +147,36 @@
59
147
  --rt-shadow-status-dot: 0 0 0 3px var(--rt-color-state-success-bg);
60
148
 
61
149
  /* State */
62
- --rt-color-state-success: var(--rt-success-500);
150
+ --rt-color-state-success: var(--rt-success-500); /* rt-theme-shared: цвет статуса один в обеих темах */
63
151
  --rt-color-state-success-bg: var(--rt-success-50);
64
- --rt-color-state-warning: var(--rt-warning-500);
152
+ --rt-color-state-warning: var(--rt-warning-500); /* rt-theme-shared: цвет статуса один в обеих темах */
65
153
  --rt-color-state-warning-bg: var(--rt-warning-50);
66
- --rt-color-state-danger: var(--rt-danger-500);
154
+
155
+ /* Подпись на подложке предупреждения — ступенью темнее самого статуса: сам
156
+ статус на своей подложке порога контраста не берёт. Пара к error-text. */
157
+ --rt-color-state-warning-text: var(--rt-warning-600);
158
+ --rt-color-state-danger: var(--rt-danger-500); /* rt-theme-shared: цвет статуса один в обеих темах */
67
159
  --rt-color-state-danger-bg: var(--rt-danger-50);
68
160
  --rt-color-state-error-text: var(--rt-danger-600);
69
- --rt-color-state-info: var(--rt-info-500);
161
+ --rt-color-state-info: var(--rt-info-500); /* rt-theme-shared: цвет статуса один в обеих темах */
70
162
  --rt-color-state-info-bg: var(--rt-info-50);
71
163
 
72
164
  /* Chat — пузыри переписки. Входящее и своё различаются фоном, а не рамкой:
73
165
  рамка на каждом пузыре дробит ленту. Отметка прочтения синяя — единственный
74
166
  цветной элемент подвала пузыря, остальные статусы приглушены. */
75
- --rt-chat-bubble-in-bg: var(--rt-blue-50);
76
- --rt-chat-bubble-in-author: var(--rt-blue-700);
167
+ --rt-chat-bubble-in-bg: var(--rt-brand-50);
168
+ --rt-chat-bubble-in-author: var(--rt-brand-700);
77
169
  --rt-chat-bubble-own-bg: var(--rt-neutral-100);
78
170
  --rt-chat-bubble-own-author: var(--rt-neutral-500);
79
171
  --rt-chat-bubble-date: var(--rt-color-text-muted);
80
- --rt-chat-status-read: var(--rt-blue-400);
172
+ --rt-chat-status-read: var(--rt-brand-400);
81
173
 
82
174
  /* Special — Auth surface (gradient bg + transparent card в dark) */
83
175
  --rt-color-bg-page-auth: var(--rt-neutral-50);
84
176
  --rt-color-bg-surface-auth-card: var(--rt-neutral-0);
85
177
 
86
178
  /* Spacing aliases — named semantic aliases на primitive numeric scale */
87
- --rt-space-2xs: 2px;
179
+ --rt-space-2xs: var(--rt-space-0-5); /* 2px */
88
180
  --rt-space-xs: var(--rt-space-1); /* 4px */
89
181
  --rt-space-sm: var(--rt-space-2); /* 8px */
90
182
  --rt-space-md: var(--rt-space-4); /* 16px */
@@ -94,7 +186,7 @@
94
186
  --rt-space-3xl: var(--rt-space-16); /* 64px */
95
187
 
96
188
  /* Text size base — semantic alias для default body text */
97
- --rt-text-base: 16px;
189
+ --rt-text-base: var(--rt-text-md);
98
190
 
99
191
  /* Form input — composition tokens. Единый контракт для всего input-семейства
100
192
  (rt-input, rt-input-number, rt-autocomplete, rt-select, rt-multiselect,
@@ -104,7 +196,7 @@
104
196
  /* Colors */
105
197
  --rt-input-color-bg: var(--rt-color-bg-surface-subtle);
106
198
  --rt-input-color-bg-disabled: var(--rt-color-bg-surface-subtle);
107
- --rt-input-color-bg-hover: var(--rt-overlay-black-4);
199
+ --rt-input-color-bg-hover: var(--rt-overlay-black-8);
108
200
  --rt-input-color-border: var(--rt-color-border-default);
109
201
  --rt-input-color-border-focus: var(--rt-color-action-primary);
110
202
  --rt-input-color-border-error: var(--rt-color-state-danger);
@@ -123,7 +215,7 @@
123
215
 
124
216
  /* Radius / spacing / border */
125
217
  --rt-input-radius: var(--rt-radius-lg);
126
- --rt-input-padding-x: var(--rt-space-3);
218
+ --rt-input-padding-x: var(--rt-space-4);
127
219
  --rt-input-padding-y: var(--rt-space-0);
128
220
  --rt-input-border-width: var(--rt-border-width-thin);
129
221
  --rt-input-focus-outline-offset: var(--rt-border-width-thin);
@@ -157,7 +249,7 @@
157
249
  набирается табличными цифрами и держит ширину, иначе кнопки прыгают
158
250
  при переходе через десяток. */
159
251
  --rt-counter-gap: var(--rt-space-sm);
160
- --rt-counter-value-min-width: 24px;
252
+ --rt-counter-value-min-width: var(--rt-size-6);
161
253
  --rt-counter-value-font-size: var(--rt-text-md);
162
254
  --rt-counter-value-color: var(--rt-color-text-primary);
163
255
  --rt-counter-row-gap: var(--rt-space-md);
@@ -173,7 +265,7 @@
173
265
  --rt-toggle-color-track-on: var(--rt-color-action-primary);
174
266
  --rt-toggle-color-border: var(--rt-color-border-strong);
175
267
  --rt-toggle-color-thumb: var(--rt-color-bg-surface);
176
- --rt-toggle-color-icon: var(--rt-amber-400);
268
+ --rt-toggle-color-icon: var(--rt-amber-400); /* rt-theme-shared: янтарь иконки один в обеих темах */
177
269
  --rt-toggle-shadow-thumb: var(--rt-shadow-md);
178
270
 
179
271
  /* Рамка off-трека — inset-тенью, а не border: у border своя коробка, и
@@ -182,26 +274,26 @@
182
274
 
183
275
  /* Навигация (rt-page-header). Шапка — отдельная плашка; отступ от краёв
184
276
  страницы задаёт тот, кто её ставит. */
185
- --rt-nav-header-padding: var(--rt-space-2-5) var(--rt-space-3);
186
- --rt-nav-header-color-bg: var(--rt-neutral-150);
277
+ --rt-nav-header-padding: var(--rt-space-2) var(--rt-space-4);
278
+ --rt-nav-header-color-bg: var(--rt-neutral-50);
187
279
 
188
280
  /* Первый уровень. Пункт ряда несёт плашку цвета самой шапки: на общем фоне её
189
281
  не видно, и белым проступает только активный раздел. Наведение красит
190
282
  подпись, а не фон — иначе оно спорит с этой подсветкой. */
191
- --rt-nav-item-height: 28px;
283
+ --rt-nav-item-height: var(--rt-size-6);
192
284
  --rt-nav-item-gap: var(--rt-space-1);
193
- --rt-nav-item-padding: var(--rt-space-1-5) var(--rt-space-2);
194
- --rt-nav-item-content-gap: var(--rt-space-1-5);
285
+ --rt-nav-item-padding: var(--rt-space-2) var(--rt-space-2);
286
+ --rt-nav-item-content-gap: var(--rt-space-2);
195
287
  --rt-nav-item-font-size: var(--rt-text-sm);
196
288
  --rt-nav-item-font-weight: var(--rt-font-weight-semibold);
197
289
  --rt-nav-item-line-height: var(--rt-leading-none);
198
290
  --rt-nav-item-color: var(--rt-color-text-primary);
199
291
  --rt-nav-item-color-hover: var(--rt-color-action-primary);
200
292
  --rt-nav-item-color-pressed: var(--rt-color-action-primary-hover);
201
- --rt-nav-item-color-bg: var(--rt-neutral-150);
202
- --rt-nav-item-color-border: var(--rt-neutral-150);
293
+ --rt-nav-item-color-bg: var(--rt-neutral-50);
294
+ --rt-nav-item-color-border: var(--rt-neutral-50);
203
295
  --rt-nav-item-color-bg-active: var(--rt-color-bg-surface);
204
- --rt-nav-item-color-caret: var(--rt-neutral-250);
296
+ --rt-nav-item-color-caret: var(--rt-neutral-200);
205
297
 
206
298
  /* Фокус обведён пунктиром: сплошная рамка на плашке пункта неотличима от его
207
299
  же границы. */
@@ -210,18 +302,18 @@
210
302
  /* Недоступный пункт светлее доступного, а не другого оттенка: общий
211
303
  `text-disabled` уходит в сине-стальной и рядом с серой подписью читается
212
304
  как второй цвет, а не как выключенное состояние. */
213
- --rt-nav-color-disabled: var(--rt-neutral-350);
305
+ --rt-nav-color-disabled: var(--rt-neutral-300);
214
306
 
215
307
  /* Попап профиля. Подложку берёт у панели навигации, своего здесь — габариты
216
308
  блока пользователя, тень и набор строк: строк четыре, и они читаются как
217
309
  список действий, а не как выпадающее меню. */
218
- --rt-profile-menu-min-width: 240px;
310
+ --rt-profile-menu-min-width: var(--rt-size-60);
219
311
  --rt-profile-menu-padding: var(--rt-space-5);
220
312
  --rt-profile-menu-shadow: var(--rt-shadow-profile-menu);
221
- --rt-profile-avatar-size: 42px;
313
+ --rt-profile-avatar-size: var(--rt-size-10);
222
314
  --rt-profile-avatar-font-size: var(--rt-text-2xl);
223
- --rt-profile-item-padding-y: var(--rt-space-3);
224
- --rt-profile-item-content-gap: var(--rt-space-2-5);
315
+ --rt-profile-item-padding-y: var(--rt-space-4);
316
+ --rt-profile-item-content-gap: var(--rt-space-2);
225
317
  --rt-profile-item-font-size: var(--rt-text-md);
226
318
  --rt-profile-item-font-weight: var(--rt-font-weight-medium);
227
319
  --rt-profile-item-radius: var(--rt-radius-md);
@@ -229,24 +321,24 @@
229
321
  /* Строки выступают за содержимое панели на половину её отступа: так
230
322
  подсветка на наведении не упирается в рамку, а иконка остаётся на одной
231
323
  вертикали с содержимым. Это же число — горизонтальный отступ строки. */
232
- --rt-profile-row-inset: var(--rt-space-2-5);
324
+ --rt-profile-row-inset: var(--rt-space-2);
233
325
  --rt-profile-theme-icon-padding: var(--rt-space-2);
234
326
 
235
327
  /* Габариты панели второго уровня: ширина считается числом колонок, поэтому
236
328
  колонка, промежуток и внутренний отступ — токены, из которых панель
237
329
  складывает свою ширину. По вертикали отступ крупнее: у первой группы над
238
330
  заголовком нет ничего, и панель иначе начинается впритык. */
239
- --rt-nav-panel-column-width: 250px;
331
+ --rt-nav-panel-column-width: var(--rt-size-60);
240
332
  --rt-nav-panel-column-gap: var(--rt-space-5);
241
- --rt-nav-panel-padding: var(--rt-space-3);
333
+ --rt-nav-panel-padding: var(--rt-space-4);
242
334
  --rt-nav-panel-padding-y: var(--rt-space-md);
243
- --rt-nav-panel-group-gap: var(--rt-space-7);
335
+ --rt-nav-panel-group-gap: var(--rt-space-8);
244
336
  --rt-nav-panel-item-gap: var(--rt-space-0-5);
245
- --rt-nav-panel-item-height: 24px;
337
+ --rt-nav-panel-item-height: var(--rt-size-6);
246
338
  --rt-nav-panel-item-padding: var(--rt-space-1) var(--rt-space-2);
247
339
  --rt-nav-panel-columns: 1;
248
340
  --rt-nav-panel-color-bg: var(--rt-color-bg-surface);
249
- --rt-nav-panel-color-border: var(--rt-neutral-250);
341
+ --rt-nav-panel-color-border: var(--rt-neutral-200);
250
342
  --rt-nav-panel-shadow: var(--rt-shadow-nav-panel);
251
343
 
252
344
  /* Второй уровень набран легче первого: ряд разделов держит вес, а полтора
@@ -254,23 +346,24 @@
254
346
  --rt-nav-panel-item-font-size: var(--rt-text-sm);
255
347
  --rt-nav-panel-item-font-weight: var(--rt-font-weight-medium);
256
348
  --rt-nav-panel-item-content-gap: var(--rt-space-1);
257
- --rt-nav-panel-item-color: var(--rt-neutral-520);
258
- --rt-nav-panel-item-color-bg-hover: var(--rt-neutral-150);
349
+ --rt-nav-panel-item-color: var(--rt-neutral-600);
350
+ --rt-nav-panel-item-color-bg-hover: var(--rt-neutral-50);
259
351
  --rt-nav-panel-item-color-active: var(--rt-color-text-inverse);
260
352
  --rt-nav-panel-item-color-bg-active: var(--rt-color-action-primary);
261
353
  --rt-nav-panel-group-font-size: var(--rt-text-xs);
262
354
  --rt-nav-panel-group-font-weight: var(--rt-font-weight-medium);
263
355
 
264
- /* Заголовок группы светлее пункта, но оба берут порог AA на белой панели:
265
- 4.95:1 у пункта и 4.54:1 у заголовка. */
266
- --rt-nav-panel-group-color: var(--rt-neutral-510);
267
- --rt-nav-panel-group-content-gap: var(--rt-space-1-5);
356
+ /* Заголовок группы светлее пункта, и оба берут порог контраста на белой панели.
357
+ Отношения обеих пар считает проверка тёмной темы; таблица замера — на странице
358
+ «Colors» витрины. */
359
+ --rt-nav-panel-group-color: var(--rt-neutral-600);
360
+ --rt-nav-panel-group-content-gap: var(--rt-space-2);
268
361
 
269
362
  /* Маркер непросмотренного. Точка стоит в потоке следом за подписью — и в ряду
270
363
  разделов, и в панели, и на узком экране: место ей даёт общий зазор
271
364
  содержимого пункта. */
272
- --rt-nav-caret-size: 12px;
273
- --rt-nav-marker-size: 4px;
365
+ --rt-nav-caret-size: var(--rt-size-3);
366
+ --rt-nav-marker-size: var(--rt-size-1);
274
367
  --rt-nav-marker-color: var(--rt-color-state-danger);
275
368
 
276
369
  /* Form field (rt-field) — обёртка анатомии поля: label / help / hint / error /
@@ -0,0 +1,23 @@
1
+ /* Правила тёмной темы, которые свойств не объявляют. Стоят отдельно от `_theme-dark.scss`:
2
+ тот собирается генератором из источника и держит только объявления. */
3
+
4
+ /* Body-level градиент — подложка экранов авторизации: их вьюпорт прозрачен
5
+ (`--rt-color-bg-surface-auth-card: transparent`) и просвечивает body.
6
+ Остальные экраны его не видят — rt-container кроет body непрозрачным фоном
7
+ страницы. Не shorthand `background:`, чтобы не сбросить body{}'ный
8
+ `background-color`. */
9
+ @layer rt-kit.base {
10
+ :root[data-theme='dark'] body,
11
+ html.rt-theme-dark body {
12
+ background-attachment: fixed;
13
+ background-image: linear-gradient(156deg, #122341 12.68%, #182142 99.28%);
14
+ }
15
+ }
16
+
17
+ /* rt-logo (чёрный SVG) — инверсия для читаемости на тёмном фоне */
18
+ @layer rt-kit.base {
19
+ :root[data-theme='dark'] .rt-logo,
20
+ html.rt-theme-dark .rt-logo {
21
+ filter: invert(1) brightness(1.5);
22
+ }
23
+ }
@@ -1,19 +1,26 @@
1
- /* Dark theme — переопределение СЕМАНТИЧЕСКИХ токенов (примитивы неизменны).
1
+ /* Собрано генератором `tools/build-tokens-v2.mjs` из `tokens.source.mjs` — правится там, не здесь:
2
+ правка на месте теряется на следующей сборке, и её называет `pnpm run check:tokens-build`. */
2
3
 
3
- Тело токенов вынесено в @mixin, чтобы тот же набор переопределений можно было
4
+ /* Тёмная тема — переопределение назначений; ступени шкалы неизменны.
5
+
6
+ Тело вынесено в @mixin, чтобы тот же набор переопределений можно было
4
7
  применить не только на html-уровне (тема приложения), но и к локальному
5
8
  контейнеру (side-by-side light/dark в Storybook) — без дублирования значений.
6
9
 
7
10
  База (`rt-theme-dark-tokens`) — тёплый графит для приложений и всех
8
11
  CDK-overlay'ев (асайды/диалоги/меню рендерятся на уровне body, вне
9
12
  host-классов шеллов — поэтому графит держим на :root, иначе overlay'и
10
- не наследовали бы палитру). */
13
+ не наследовали бы палитру).
14
+
15
+ Значения ответов живут в источнике рядом со своим светлым назначением: забытая половина
16
+ пары видна там же, а не вылавливается сверкой двух файлов. */
11
17
 
12
18
  @mixin rt-theme-dark-tokens {
13
19
  /* Background — тёплый графит */
14
20
  --rt-color-bg-page: var(--rt-charcoal-900);
15
21
  --rt-color-bg-surface: var(--rt-charcoal-800);
16
22
  --rt-color-bg-surface-subtle: var(--rt-charcoal-950);
23
+ --rt-color-bg-surface-subtle-2: var(--rt-charcoal-950);
17
24
  --rt-color-bg-hover: var(--rt-charcoal-700);
18
25
  --rt-color-bg-subtle: var(--rt-charcoal-950);
19
26
  --rt-color-bg-overlay: rgb(0 0 0 / 70%);
@@ -21,17 +28,17 @@
21
28
 
22
29
  /* Text — почти белый на графите */
23
30
  --rt-color-text-primary: var(--rt-neutral-50);
24
- --rt-color-text-muted: var(--rt-overlay-white-40);
31
+ --rt-color-text-muted: var(--rt-overlay-white-50);
25
32
  --rt-color-text-disabled: var(--rt-overlay-white-25);
26
33
  --rt-color-text-inverse: var(--rt-neutral-900);
27
- --rt-color-text-link: var(--rt-blue-300);
28
- --rt-color-text-link-hover: var(--rt-blue-500);
34
+ --rt-color-text-link: var(--rt-brand-300);
35
+ --rt-color-text-link-hover: var(--rt-brand-500);
29
36
 
30
37
  /* Border — приглушённые на графите */
31
38
  --rt-color-border-default: var(--rt-charcoal-border);
32
39
  --rt-color-border-strong: var(--rt-charcoal-border-strong);
33
40
  --rt-color-border-subtle: var(--rt-charcoal-border);
34
- --rt-color-border-focus: var(--rt-blue-500);
41
+ --rt-color-border-focus: var(--rt-brand-500);
35
42
 
36
43
  /* Input border видим в dark (в light — transparent). */
37
44
  --rt-input-color-border: var(--rt-charcoal-border);
@@ -49,27 +56,51 @@
49
56
  --rt-nav-item-color-bg: var(--rt-charcoal-950);
50
57
  --rt-nav-item-color-border: var(--rt-charcoal-950);
51
58
  --rt-nav-item-color-bg-active: var(--rt-charcoal-800);
52
- --rt-nav-item-color-caret: var(--rt-neutral-520);
59
+ --rt-nav-item-color-caret: var(--rt-neutral-600);
53
60
  --rt-nav-panel-color-bg: var(--rt-charcoal-800);
54
- --rt-nav-panel-color-border: var(--rt-neutral-520);
55
- --rt-nav-panel-item-color: var(--rt-neutral-280);
61
+ --rt-nav-panel-color-border: var(--rt-neutral-600);
62
+ --rt-nav-panel-item-color: var(--rt-neutral-200);
56
63
  --rt-nav-panel-item-color-bg-hover: var(--rt-charcoal-950);
57
- --rt-nav-panel-group-color: var(--rt-neutral-420);
58
- --rt-nav-color-disabled: var(--rt-neutral-520);
64
+ --rt-nav-panel-group-color: var(--rt-neutral-400);
65
+ --rt-nav-color-disabled: var(--rt-neutral-600);
59
66
 
60
- /* Action — primary остаётся синим в обеих темах */
61
- --rt-color-action-primary-subtle: rgb(21 93 252 / 16%);
67
+ /* Action — сам цвет марки один в обеих темах, а доля оттенка на графите вдвое
68
+ больше: слабый оттенок на тёмном фоне просто не виден. Считается от ступени
69
+ бренда, как и в светлой теме. */
70
+ --rt-color-action-primary-subtle: color-mix(in srgb, var(--rt-brand-500) 16%, transparent);
62
71
 
63
72
  /* Focus-ring в dark — ярче для контрастности на тёмных фонах. */
64
- --rt-color-action-primary-soft: rgb(21 93 252 / 32%);
73
+ --rt-color-action-primary-soft: color-mix(in srgb, var(--rt-brand-500) 32%, transparent);
74
+
75
+ /* Вторичное действие нейтрально, и на графите вся его тройка разворачивается:
76
+ подложка садится на приподнятую поверхность, а наведение и нажатие идут вверх
77
+ по светлоте, а не вниз, — иначе они тонут в фоне страницы. */
65
78
  --rt-color-action-secondary: var(--rt-charcoal-700);
79
+ --rt-color-action-secondary-hover: var(--rt-charcoal-border);
80
+ --rt-color-action-secondary-active: var(--rt-charcoal-border-strong);
66
81
  --rt-color-action-on-secondary: var(--rt-neutral-50);
67
82
 
83
+ /* Пятый член роли идёт против всей её тройки: подложка садится на поверхность,
84
+ а цвет на поверхности обязан от неё оторваться. Ступень нейтрали, а не графита:
85
+ графит кончается границей, и любая его ступень на карточке даёт меньше двух к
86
+ одному. Светлая тема красит тем же именем, что и подложку, и разъехаться они
87
+ могут только здесь. */
88
+ --rt-color-action-secondary-on-surface: var(--rt-neutral-400);
89
+
90
+ /* Отключённое действие на графите — та же приподнятая поверхность; подпись
91
+ наследует ответ тёмной темы по ссылке на приглушённый текст. */
92
+ --rt-color-action-disabled: var(--rt-charcoal-700);
93
+
94
+ /* Оттенок наведения на графите вдвое насыщеннее: слабый след на тёмном фоне
95
+ не виден — та же причина, что и у оттенка марки выше. */
96
+ --rt-btn-tint-hover: 16%;
97
+ --rt-btn-tint-active: 32%;
98
+
68
99
  /* Soft card-shadow в dark — насыщеннее для отделения от фона. */
69
100
  --rt-shadow-card-soft: 0 0 40px rgb(0 0 0 / 25%);
70
101
 
71
102
  /* Hover-overlay инвертирован для dark (light overlay поверх тёмного фона). */
72
- --rt-input-color-bg-hover: var(--rt-overlay-white-4);
103
+ --rt-input-color-bg-hover: var(--rt-overlay-white-8);
73
104
  --rt-icon-button-color-bg-hover: var(--rt-overlay-white-4);
74
105
 
75
106
  /* Toggle-switch — трек уходит в подложку, а бегунок остаётся светлым:
@@ -79,24 +110,29 @@
79
110
  --rt-toggle-color-thumb: var(--rt-neutral-50);
80
111
  --rt-toggle-shadow-thumb: var(--rt-shadow-none);
81
112
 
82
- /* State — surfaces под dark + ярче error-text */
83
- --rt-color-state-success-bg: rgb(5 150 105 / 12%);
84
- --rt-color-state-warning-bg: rgb(217 119 6 / 12%);
85
- --rt-color-state-danger-bg: rgb(220 38 38 / 12%);
113
+ /* State — surfaces под dark + ярче error-text.
114
+
115
+ Подложка считается от ступени своего статуса, а не повторяет её код цвета
116
+ тройкой каналов: повторённое значение расходится с источником молча, и
117
+ правка ступени оставляла подложку прежней. */
118
+ --rt-color-state-success-bg: color-mix(in srgb, var(--rt-success-500) 12%, transparent);
119
+ --rt-color-state-warning-bg: color-mix(in srgb, var(--rt-warning-500) 12%, transparent);
120
+ --rt-color-state-danger-bg: color-mix(in srgb, var(--rt-danger-500) 12%, transparent);
86
121
  --rt-color-state-error-text: var(--rt-danger-500);
87
- --rt-color-state-info-bg: rgb(37 99 235 / 12%);
122
+ --rt-color-state-warning-text: var(--rt-warning-500);
123
+ --rt-color-state-info-bg: color-mix(in srgb, var(--rt-info-500) 12%, transparent);
88
124
 
89
125
  /* Chat — на графите светлые фоны пузырей нечитаемы: входящее уходит в
90
126
  полупрозрачный синий, своё — в глубокий графит. */
91
- --rt-chat-bubble-in-bg: rgb(37 99 235 / 12%);
92
- --rt-chat-bubble-in-author: var(--rt-blue-300);
127
+ --rt-chat-bubble-in-bg: color-mix(in srgb, var(--rt-brand-500) 12%, transparent);
128
+ --rt-chat-bubble-in-author: var(--rt-brand-300);
93
129
  --rt-chat-bubble-own-bg: var(--rt-charcoal-950);
94
130
  --rt-chat-bubble-own-author: var(--rt-overlay-white-40);
95
131
  --rt-chat-bubble-date: var(--rt-overlay-white-40);
96
- --rt-chat-status-read: var(--rt-blue-300);
132
+ --rt-chat-status-read: var(--rt-brand-300);
97
133
 
98
134
  /* Special — Auth surface (градиентный фон логина + прозрачная карточка). */
99
- --rt-color-bg-page-auth: linear-gradient(156deg, #122341 12.68%, #182142 99.28%);
135
+ --rt-color-bg-page-auth: linear-gradient(156deg, var(--rt-neutral-950) 12.68%, var(--rt-navy-900) 99.28%);
100
136
  --rt-color-bg-surface-auth-card: transparent;
101
137
  }
102
138
 
@@ -104,20 +140,3 @@
104
140
  html.rt-theme-dark {
105
141
  @include rt-theme-dark-tokens;
106
142
  }
107
-
108
- /* Body-level градиент — подложка экранов авторизации: их вьюпорт прозрачен
109
- (`--rt-color-bg-surface-auth-card: transparent`) и просвечивает body.
110
- Остальные экраны его не видят — rt-container кроет body непрозрачным фоном
111
- страницы. Не shorthand `background:`, чтобы не сбросить body{}'ный
112
- `background-color`. */
113
- :root[data-theme='dark'] body,
114
- html.rt-theme-dark body {
115
- background-attachment: fixed;
116
- background-image: linear-gradient(156deg, #122341 12.68%, #182142 99.28%);
117
- }
118
-
119
- /* rt-logo (чёрный SVG) — инверсия для читаемости на тёмном фоне */
120
- :root[data-theme='dark'] .rt-logo,
121
- html.rt-theme-dark .rt-logo {
122
- filter: invert(1) brightness(1.5);
123
- }