@rt-tools/ui-kit-v2 0.8.0 → 0.10.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 (69) hide show
  1. package/fesm2022/rt-tools-ui-kit-v2.mjs +608 -82
  2. package/fesm2022/rt-tools-ui-kit-v2.mjs.map +1 -1
  3. package/package.json +5 -5
  4. package/rt-tools-ui-kit-v2-0.10.0.tgz +0 -0
  5. package/src/assets/icons/social-facebook.svg +7 -0
  6. package/src/assets/icons/social-instagram.svg +14 -0
  7. package/src/assets/icons/social-kakaotalk.svg +7 -0
  8. package/src/assets/icons/social-line.svg +7 -0
  9. package/src/assets/icons/social-naver.svg +7 -0
  10. package/src/assets/icons/social-pinterest.svg +7 -0
  11. package/src/assets/icons/social-tiktok.svg +7 -0
  12. package/src/assets/icons/social-vk.svg +7 -0
  13. package/src/assets/icons/social-wechat.svg +7 -0
  14. package/src/assets/icons/social-x.svg +7 -0
  15. package/src/assets/icons/social-xiaohongshu.svg +7 -0
  16. package/src/assets/icons/social-youtube.svg +7 -0
  17. package/src/assets/icons-material/NOTICE.md +20 -0
  18. package/src/assets/icons-material/arrow-left.svg +3 -0
  19. package/src/assets/icons-material/ban.svg +5 -0
  20. package/src/assets/icons-material/bars.svg +3 -0
  21. package/src/assets/icons-material/check.svg +3 -0
  22. package/src/assets/icons-material/chevron-down.svg +3 -0
  23. package/src/assets/icons-material/chevron-left.svg +3 -0
  24. package/src/assets/icons-material/chevron-right.svg +3 -0
  25. package/src/assets/icons-material/close.svg +3 -0
  26. package/src/assets/icons-material/cloud-upload.svg +5 -0
  27. package/src/assets/icons-material/cog.svg +5 -0
  28. package/src/assets/icons-material/copy.svg +5 -0
  29. package/src/assets/icons-material/ellipsis-h.svg +5 -0
  30. package/src/assets/icons-material/ellipsis-v.svg +5 -0
  31. package/src/assets/icons-material/external-link.svg +5 -0
  32. package/src/assets/icons-material/eye-slash.svg +5 -0
  33. package/src/assets/icons-material/eye.svg +5 -0
  34. package/src/assets/icons-material/ico-download.svg +5 -0
  35. package/src/assets/icons-material/ico-plus.svg +3 -0
  36. package/src/assets/icons-material/info-circle.svg +5 -0
  37. package/src/assets/icons-material/pencil.svg +5 -0
  38. package/src/assets/icons-material/refresh.svg +5 -0
  39. package/src/assets/icons-material/search.svg +5 -0
  40. package/src/assets/icons-material/star.svg +5 -0
  41. package/src/assets/icons-material/sync.svg +5 -0
  42. package/src/assets/icons-material/table.svg +5 -0
  43. package/src/assets/icons-material/tag.svg +5 -0
  44. package/src/assets/icons-material/trash.svg +5 -0
  45. package/src/assets/icons-material/user.svg +5 -0
  46. package/src/lib/components/aside/CONTEXT.md +15 -0
  47. package/src/lib/components/aside/_rt-aside-overlay.scss +35 -22
  48. package/src/lib/components/aside-section/CONTEXT.md +8 -0
  49. package/src/lib/components/aside-section/rt-aside-section.component.scss +4 -16
  50. package/src/lib/components/button/rt-button.directive.scss +10 -1
  51. package/src/lib/components/icon/CONTEXT.md +23 -0
  52. package/src/lib/components/icon/rt-icon.component.scss +3 -0
  53. package/src/lib/components/icon-button/rt-icon-button.component.scss +31 -1
  54. package/src/lib/components/page-header/CONTEXT.md +19 -7
  55. package/src/lib/components/page-header/rt-page-header-compact.scss +149 -0
  56. package/src/lib/components/photo-viewer/rt-photo-viewer.component.scss +11 -4
  57. package/src/lib/components/ripple/rt-ripple.directive.scss +46 -0
  58. package/src/lib/components/skeleton/rt-skeleton.component.scss +3 -3
  59. package/src/lib/components/tabs/CONTEXT.md +4 -0
  60. package/src/styles/_form.scss +240 -0
  61. package/src/styles/_index.scss +16 -0
  62. package/src/styles/_preset-material.scss +102 -0
  63. package/src/styles/_primitives.scss +74 -4
  64. package/src/styles/_scrollbar.scss +39 -0
  65. package/src/styles/_semantic.scss +35 -24
  66. package/src/styles/_theme-dark.scss +16 -12
  67. package/styles/tokens.css +520 -38
  68. package/types/rt-tools-ui-kit-v2.d.ts +184 -20
  69. package/rt-tools-ui-kit-v2-0.8.0.tgz +0 -0
@@ -8,6 +8,12 @@
8
8
 
9
9
  @forward './primitives';
10
10
  @forward './semantic';
11
+
12
+ // Материальный набор стоит между назначениями и тёмной темой: у признака набора и признака
13
+ // тёмной темы на корне одинаковая специфичность, и порядок здесь — единственное, чем тёмная
14
+ // тема выигрывает у набора.
15
+ @forward './preset-material';
16
+
11
17
  @forward './theme-dark';
12
18
  @forward './theme-dark-rules';
13
19
  @forward './scrollbar';
@@ -18,7 +24,17 @@
18
24
  // этого не видят — истории у экрана входа нет.
19
25
  @forward './login';
20
26
 
27
+ // Словарь формы панели: раздел, колонка контролов, строка контрола, элемент в ряду. Он тоже
28
+ // объявлен классами, а не компонентом, и другого пути к потребителю у него нет. Без этой строки
29
+ // приложение размечает панель именами, которым ни одно правило не отвечает, — то есть заводит
30
+ // раскладку у себя, ради чего словарь и переехал в кит.
31
+ @forward './form';
32
+
21
33
  // Стили директивы кнопки: своего представления у директивы нет, поэтому её `.scss` не
22
34
  // подключён ни одним `styleUrl`. Без этой строки потребитель, взявший `tokens.css` по
23
35
  // инструкции README, получает `rtButton`, нарисованный браузерной кнопкой.
24
36
  @forward '../lib/components/button/rt-button.directive';
37
+
38
+ // Стили волны нажатия — по той же причине: директива своего представления не имеет.
39
+ // Без этой строки узел волны ставится в разметку и остаётся невидимым.
40
+ @forward '../lib/components/ripple/rt-ripple.directive';
@@ -0,0 +1,102 @@
1
+ /* Built by the generator `tools/build-tokens-v2.mjs` from `tokens.source.mjs` — edited there, not here:
2
+ an edit on the spot is lost on the next build, and `pnpm run check:tokens-build` names it. */
3
+
4
+ /* The material preset — a second layer of assignments: the kit drawn in the look of the first kit.
5
+
6
+ It does not touch the scale steps: a rewritten step would repaint the dark theme as well,
7
+ and the dark theme refers to those same steps. The values come from the material steps of the scale.
8
+
9
+ The body is taken into a @mixin for the same reason as the dark theme's: the preset is needed not
10
+ only on `:root` but on a separate container too — otherwise two presets cannot be shown side by side.
11
+
12
+ The preset rule is declared before the dark theme on purpose: the root signs have equal
13
+ specificity, and the order in the file is the only thing by which the dark theme wins over the preset. */
14
+
15
+ @mixin rt-preset-material-tokens {
16
+ /* Подложки */
17
+ --rt-color-bg-page: var(--rt-mat-neutral-5);
18
+ --rt-color-bg-surface: var(--rt-mat-neutral-0);
19
+ --rt-color-bg-surface-subtle: var(--rt-mat-overlay-black-4);
20
+ --rt-color-bg-surface-subtle-2: var(--rt-mat-neutral-15);
21
+ --rt-color-bg-hover: var(--rt-mat-neutral-10);
22
+ --rt-color-bg-subtle: var(--rt-mat-neutral-10);
23
+ --rt-color-bg-overlay: var(--rt-mat-overlay-black-32);
24
+ --rt-color-bg-inverse: var(--rt-mat-neutral-100);
25
+ --rt-color-bg-nav: var(--rt-mat-navy-100); /* марка первого кита: обвязка тёмная в обоих наборах */
26
+ --rt-color-bg-page-auth: var(--rt-mat-neutral-5);
27
+ --rt-color-bg-surface-auth-card: var(--rt-mat-neutral-0);
28
+
29
+ /* Текст */
30
+ --rt-color-text-primary: var(--rt-mat-neutral-100);
31
+ --rt-color-text-muted: var(--rt-mat-neutral-60);
32
+ --rt-color-text-disabled: var(--rt-mat-neutral-40);
33
+ --rt-color-text-inverse: var(--rt-mat-neutral-0);
34
+ --rt-color-text-link: var(--rt-mat-blue-100);
35
+ --rt-color-text-link-hover: var(--rt-mat-blue-hover);
36
+
37
+ /* Рамки */
38
+ --rt-color-border-default: var(--rt-mat-neutral-25);
39
+ --rt-color-border-strong: var(--rt-mat-neutral-30);
40
+ --rt-color-border-subtle: var(--rt-mat-neutral-20);
41
+ --rt-color-border-focus: var(--rt-mat-blue-40); /* кольцо фокуса первого кита светлее его действия */
42
+
43
+ /* Действие: подложка, наведение, нажатие, подпись на них и цвет роли на поверхности */
44
+ --rt-color-action-primary: var(--rt-mat-blue-100);
45
+ --rt-color-action-primary-hover: var(--rt-mat-blue-hover);
46
+ --rt-color-action-primary-active: var(--rt-mat-blue-active);
47
+ --rt-color-action-primary-subtle: var(--rt-mat-overlay-blue-8);
48
+ --rt-color-action-primary-soft: var(--rt-mat-overlay-blue-24);
49
+ --rt-color-action-on-primary: var(--rt-mat-neutral-0);
50
+ --rt-color-action-secondary: var(--rt-mat-neutral-60);
51
+ --rt-color-action-secondary-hover: var(--rt-mat-neutral-hover);
52
+ --rt-color-action-secondary-active: var(--rt-mat-neutral-active);
53
+ --rt-color-action-on-secondary: var(--rt-mat-neutral-0);
54
+ --rt-color-action-secondary-on-surface: var(--rt-mat-neutral-60);
55
+ --rt-color-action-success: var(--rt-mat-green-80);
56
+ --rt-color-action-success-hover: var(--rt-mat-green-hover);
57
+ --rt-color-action-success-active: var(--rt-mat-green-active);
58
+ --rt-color-action-on-success: var(--rt-mat-neutral-0);
59
+ --rt-color-action-warning: var(--rt-mat-orange-80);
60
+ --rt-color-action-warning-hover: var(--rt-mat-orange-hover);
61
+ --rt-color-action-warning-active: var(--rt-mat-orange-active);
62
+ --rt-color-action-on-warning: var(--rt-mat-neutral-0);
63
+ --rt-color-action-danger: var(--rt-mat-red-100);
64
+ --rt-color-action-danger-hover: var(--rt-mat-red-hover);
65
+ --rt-color-action-danger-active: var(--rt-mat-red-active);
66
+ --rt-color-action-on-danger: var(--rt-mat-neutral-0);
67
+ --rt-color-action-info: var(--rt-mat-blue-100);
68
+ --rt-color-action-info-hover: var(--rt-mat-blue-hover);
69
+ --rt-color-action-info-active: var(--rt-mat-blue-active);
70
+ --rt-color-action-on-info: var(--rt-mat-neutral-0);
71
+ --rt-color-action-disabled: var(--rt-mat-neutral-25);
72
+
73
+ /* Состояния: цвет роли и её светлая подложка */
74
+ --rt-color-state-success: var(--rt-mat-green-100);
75
+ --rt-color-state-success-bg: var(--rt-mat-green-10);
76
+ --rt-color-state-warning: var(--rt-mat-orange-100);
77
+ --rt-color-state-warning-bg: var(--rt-mat-orange-5);
78
+ --rt-color-state-warning-text: var(--rt-mat-orange-100);
79
+ --rt-color-state-danger: var(--rt-mat-red-100);
80
+ --rt-color-state-danger-bg: var(--rt-mat-red-10);
81
+ --rt-color-state-error-text: var(--rt-mat-red-100);
82
+ --rt-color-state-info: var(--rt-mat-blue-100);
83
+ --rt-color-state-info-bg: var(--rt-mat-blue-20);
84
+
85
+ /* Рельса шагов */
86
+ --rt-color-stepper-track: var(--rt-mat-neutral-30);
87
+
88
+ /* Заглушка загрузки: краски те же, что набор давал ей прежде через подложку и
89
+ рамку, — вид под набором от разведения концов не поехал. */
90
+ --rt-color-skeleton-base: var(--rt-mat-neutral-10);
91
+ --rt-color-skeleton-wave: var(--rt-mat-neutral-25);
92
+
93
+ /* Кнопка и поле первого кита скруглены заметно сильнее: 1.5rem против 10px.
94
+ Значение снято числом — ссылки на токены первого кита во второй кит не едут. */
95
+ --rt-radius-control: 1.5rem;
96
+ }
97
+
98
+ :root[data-preset='material'],
99
+ [data-preset='material'],
100
+ .rt-preset-material {
101
+ @include rt-preset-material-tokens;
102
+ }
@@ -1,8 +1,8 @@
1
- /* Собрано генератором `tools/build-tokens-v2.mjs` из `tokens.source.mjs` — правится там, не здесь:
2
- правка на месте теряется на следующей сборке, и её называет `pnpm run check:tokens-build`. */
1
+ /* Built by the generator `tools/build-tokens-v2.mjs` from `tokens.source.mjs` — edited there, not here:
2
+ an edit on the spot is lost on the next build, and `pnpm run check:tokens-build` names it. */
3
3
 
4
- /* Ступени шкал — значения, из которых слой назначений выбирает. Единственное место кита, где
5
- код цвета и размер числом законны по определению. */
4
+ /* The scale steps — the values the assignment layer chooses from. The only place in the kit where
5
+ a colour code and a size as a number are lawful by definition. */
6
6
 
7
7
  :root {
8
8
  /* Neutral scale — серая, без цветности.
@@ -291,4 +291,74 @@
291
291
  --rt-bp-md: 768px;
292
292
  --rt-bp-lg: 1080px;
293
293
  --rt-bp-xl: 1380px;
294
+
295
+ /* Материальный набор: нейтральный ряд первого кита */
296
+ --rt-mat-neutral-0: #fff;
297
+ --rt-mat-neutral-5: #f5f6f8;
298
+ --rt-mat-neutral-10: #f3f3f3;
299
+ --rt-mat-neutral-15: #eee;
300
+ --rt-mat-neutral-20: #e8e8e8;
301
+ --rt-mat-neutral-25: #e0e0e0;
302
+ --rt-mat-neutral-30: #d1d1d1;
303
+ --rt-mat-neutral-35: #ccc;
304
+ --rt-mat-neutral-40: #a3a3a3;
305
+ --rt-mat-neutral-60: #747474;
306
+ --rt-mat-neutral-80: #323033;
307
+ --rt-mat-neutral-100: #181818;
308
+
309
+ /* Материальный набор: синий — действие, ссылка, кольцо фокуса */
310
+ --rt-mat-blue-20: #eaedfc;
311
+ --rt-mat-blue-40: #b3ceef;
312
+ --rt-mat-blue-60: #6d96e8;
313
+ --rt-mat-blue-80: #4285f4;
314
+ --rt-mat-blue-100: #4284d7;
315
+
316
+ /* Материальный набор: красный — опасное действие и ошибка */
317
+ --rt-mat-red-10: #fdedee;
318
+ --rt-mat-red-20: #efc0c1;
319
+ --rt-mat-red-40: #f7b9bb;
320
+ --rt-mat-red-60: #e88487;
321
+ --rt-mat-red-80: #df6064;
322
+ --rt-mat-red-100: #eb5055;
323
+
324
+ /* Материальный набор: оранжевый — предупреждение */
325
+ --rt-mat-orange-5: #f6e4d9;
326
+ --rt-mat-orange-10: #e8cbbf;
327
+ --rt-mat-orange-20: #e1ba9e;
328
+ --rt-mat-orange-40: #e4a985;
329
+ --rt-mat-orange-60: #f1a05d;
330
+ --rt-mat-orange-70: #f2994a;
331
+ --rt-mat-orange-80: #ee7a34;
332
+ --rt-mat-orange-100: #ef7128;
333
+
334
+ /* Материальный набор: зелёный — успех */
335
+ --rt-mat-green-10: #e5f8f4;
336
+ --rt-mat-green-20: #baf4e0;
337
+ --rt-mat-green-40: #5dbfbc;
338
+ --rt-mat-green-60: #46c4c0;
339
+ --rt-mat-green-80: #21b18e;
340
+ --rt-mat-green-100: #01af8d;
341
+
342
+ /* Материальный набор: марка первого кита и подложка его обвязки */
343
+ --rt-mat-navy-100: #0d1c2b;
344
+
345
+ /* Прозрачные оттенки считаются от своих ступеней, а не повторяют их коды цвета. */
346
+ --rt-mat-overlay-black-4: color-mix(in srgb, var(--rt-mat-neutral-100) 4%, transparent);
347
+ --rt-mat-overlay-black-32: color-mix(in srgb, var(--rt-mat-neutral-100) 32%, transparent);
348
+ --rt-mat-overlay-blue-8: color-mix(in srgb, var(--rt-mat-blue-100) 8%, transparent);
349
+ --rt-mat-overlay-blue-24: color-mix(in srgb, var(--rt-mat-blue-100) 24%, transparent);
350
+
351
+ /* Наведение и нажатие первый кит считает от своей ступени тем же приёмом — подмешивая
352
+ чёрное. Ступени здесь считаются так же, а не подбираются на глаз: иначе перекрашенная
353
+ марка перестанет темнеть под курсором вместе с остальным. */
354
+ --rt-mat-blue-hover: color-mix(in srgb, var(--rt-mat-blue-100) 90%, #000);
355
+ --rt-mat-blue-active: color-mix(in srgb, var(--rt-mat-blue-100) 80%, #000);
356
+ --rt-mat-green-hover: color-mix(in srgb, var(--rt-mat-green-80) 90%, #000);
357
+ --rt-mat-green-active: color-mix(in srgb, var(--rt-mat-green-80) 80%, #000);
358
+ --rt-mat-orange-hover: color-mix(in srgb, var(--rt-mat-orange-80) 90%, #000);
359
+ --rt-mat-orange-active: color-mix(in srgb, var(--rt-mat-orange-80) 80%, #000);
360
+ --rt-mat-red-hover: color-mix(in srgb, var(--rt-mat-red-100) 90%, #000);
361
+ --rt-mat-red-active: color-mix(in srgb, var(--rt-mat-red-100) 80%, #000);
362
+ --rt-mat-neutral-hover: color-mix(in srgb, var(--rt-mat-neutral-60) 90%, #000);
363
+ --rt-mat-neutral-active: color-mix(in srgb, var(--rt-mat-neutral-60) 80%, #000);
294
364
  }
@@ -1,4 +1,23 @@
1
1
  @layer rt-kit.base {
2
+ // Тихая полоса: место под неё занято всегда, а ползунка не видно, пока на зону не навели.
3
+ // Приёмы, которыми заменяют убранное из браузеров наложение полосы поверх содержимого,
4
+ // показывают её вместе с её местом — и содержимое дёргается вбок на каждом наведении. Здесь
5
+ // двигается только цвет, поэтому раскладка стоит на месте.
6
+ // Стандартные свойства объявлены рядом с псевдоэлементами: одни понимает одна ветка
7
+ // браузеров, другие — другая, и написанные порознь они расходятся видом.
8
+ * {
9
+ scrollbar-color: transparent transparent;
10
+ scrollbar-width: thin;
11
+ }
12
+
13
+ // Проявляется ползунок наведением на саму зону, а не на себя: навести на невидимое нечем.
14
+ // Фокус внутри зоны показывает его наравне — прокрутка с клавиатуры идёт без указателя, и
15
+ // человек иначе не видит ни того, где он в списке, ни того, что список прокручивается.
16
+ *:hover,
17
+ *:focus-within {
18
+ scrollbar-color: var(--rt-color-border-default) transparent;
19
+ }
20
+
2
21
  ::-webkit-scrollbar {
3
22
  width: 12px;
4
23
  }
@@ -10,6 +29,12 @@
10
29
  ::-webkit-scrollbar-thumb {
11
30
  border: var(--rt-border-width-thick) solid transparent;
12
31
  border-radius: var(--rt-radius-md);
32
+ background: transparent;
33
+ background-clip: content-box;
34
+ }
35
+
36
+ *:hover::-webkit-scrollbar-thumb,
37
+ *:focus-within::-webkit-scrollbar-thumb {
13
38
  background: var(--rt-color-border-default);
14
39
  background-clip: content-box;
15
40
  }
@@ -23,4 +48,18 @@
23
48
  ::-webkit-scrollbar-track:hover {
24
49
  border: var(--rt-border-width-thin) solid var(--rt-color-bg-subtle);
25
50
  }
51
+
52
+ // Там, где наведения не бывает, тихая полоса осталась бы невидимой навсегда: на сенсорном
53
+ // экране указателя нет вовсе, а признак прокручиваемости зоны нужен ровно так же.
54
+ // Ветка hover-none: наведения на этом экране не бывает.
55
+ @media (hover: none) {
56
+ * {
57
+ scrollbar-color: var(--rt-color-border-default) transparent;
58
+ }
59
+
60
+ ::-webkit-scrollbar-thumb {
61
+ background: var(--rt-color-border-default);
62
+ background-clip: content-box;
63
+ }
64
+ }
26
65
  }
@@ -1,12 +1,12 @@
1
- /* Собрано генератором `tools/build-tokens-v2.mjs` из `tokens.source.mjs` — правится там, не здесь:
2
- правка на месте теряется на следующей сборке, и её называет `pnpm run check:tokens-build`. */
1
+ /* Built by the generator `tools/build-tokens-v2.mjs` from `tokens.source.mjs` — edited there, not here:
2
+ an edit on the spot is lost on the next build, and `pnpm run check:tokens-build` names it. */
3
3
 
4
- /* Назначения светлой темы.
4
+ /* The light theme's assignments.
5
5
 
6
- Тело вынесено в @mixin по той же причине, что и у тёмной темы: набор нужен не
7
- только на `:root`, но и на отдельном контейнере. Без этого светлую половину
8
- пары «светлая ↔ тёмная» нельзя показать, пока приложение стоит в тёмной теме, —
9
- контейнер унаследует тёмные значения, и обе половины покажут одно и то же. */
6
+ The body is carried into an @mixin for the same reason as the dark theme's: the set is needed not
7
+ only on `:root` but on a separate container too. Without that the light half of the
8
+ pair «light ↔ dark» cannot be shown while the application stands in the dark theme —
9
+ the container would inherit the dark values, and both halves would show the same. */
10
10
 
11
11
  @mixin rt-theme-light-tokens {
12
12
  /* Background */
@@ -133,19 +133,6 @@
133
133
  0 0 0 var(--rt-focus-ring-offset) var(--rt-color-bg-surface),
134
134
  0 0 0 calc(var(--rt-focus-ring-offset) + var(--rt-focus-ring-width)) var(--rt-focus-ring-color-danger);
135
135
 
136
- /* Stepper (rt-stepper) — рельса прогресса. Текущий шаг — янтарный (одинаков
137
- в обеих темах); трек/прогресс переопределяются в dark на приглушённые. */
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: янтарь текущего шага один в обеих темах */
140
- --rt-color-stepper-track: var(--rt-gray-350);
141
- --rt-color-stepper-progress: var(--rt-color-action-primary);
142
-
143
- /* Step-indicator ring — halo вокруг активного пункта rt-stepper. */
144
- --rt-shadow-step-indicator: 0 0 0 4px var(--rt-color-stepper-current-subtle);
145
-
146
- /* Status-dot ring — halo вокруг точки «объект занят сейчас». */
147
- --rt-shadow-status-dot: 0 0 0 3px var(--rt-color-state-success-bg);
148
-
149
136
  /* State */
150
137
  --rt-color-state-success: var(--rt-success-500); /* rt-theme-shared: цвет статуса один в обеих темах */
151
138
  --rt-color-state-success-bg: var(--rt-success-50);
@@ -161,6 +148,19 @@
161
148
  --rt-color-state-info: var(--rt-info-500); /* rt-theme-shared: цвет статуса один в обеих темах */
162
149
  --rt-color-state-info-bg: var(--rt-info-50);
163
150
 
151
+ /* Stepper (rt-stepper) — рельса прогресса. Текущий шаг — янтарный (одинаков
152
+ в обеих темах); трек/прогресс переопределяются в dark на приглушённые. */
153
+ --rt-color-stepper-current: var(--rt-amber-400); /* rt-theme-shared: янтарь текущего шага один в обеих темах */
154
+ --rt-color-stepper-current-subtle: var(--rt-overlay-amber-16); /* rt-theme-shared: янтарь текущего шага один в обеих темах */
155
+ --rt-color-stepper-track: var(--rt-gray-350);
156
+ --rt-color-stepper-progress: var(--rt-color-action-primary);
157
+
158
+ /* Step-indicator ring — halo вокруг активного пункта rt-stepper. */
159
+ --rt-shadow-step-indicator: 0 0 0 4px var(--rt-color-stepper-current-subtle);
160
+
161
+ /* Status-dot ring — halo вокруг точки «объект занят сейчас». */
162
+ --rt-shadow-status-dot: 0 0 0 3px var(--rt-color-state-success-bg);
163
+
164
164
  /* Chat — пузыри переписки. Входящее и своё различаются фоном, а не рамкой:
165
165
  рамка на каждом пузыре дробит ленту. Отметка прочтения синяя — единственный
166
166
  цветной элемент подвала пузыря, остальные статусы приглушены. */
@@ -175,6 +175,12 @@
175
175
  --rt-color-bg-page-auth: var(--rt-neutral-50);
176
176
  --rt-color-bg-surface-auth-card: var(--rt-neutral-0);
177
177
 
178
+ /* Skeleton (rt-skeleton) — заглушка загрузки. Два конца перелива: покой и гребень
179
+ волны. Имена свои, а не роли подложки и рамки: в светлом наборе те ведут на одну краску,
180
+ и перелив между ними стоял ровной заливкой. */
181
+ --rt-color-skeleton-base: var(--rt-neutral-100);
182
+ --rt-color-skeleton-wave: var(--rt-neutral-50);
183
+
178
184
  /* Spacing aliases — named semantic aliases на primitive numeric scale */
179
185
  --rt-space-2xs: var(--rt-space-0-5); /* 2px */
180
186
  --rt-space-xs: var(--rt-space-1); /* 4px */
@@ -213,8 +219,13 @@
213
219
  внутри flex-баров контрол без ограничения растягивается на всю строку. */
214
220
  --rt-input-max-width: var(--rt-control-max-width);
215
221
 
222
+ /* Скругление контрола — назначение, а не ступень на месте. Кнопка, поле ввода и
223
+ всё, что стоит с ними в строке, берут его отсюда: набор оформления живёт слоем
224
+ назначений и до ступени, взятой компонентом напрямую, не достаёт. */
225
+ --rt-radius-control: var(--rt-radius-lg);
226
+
216
227
  /* Radius / spacing / border */
217
- --rt-input-radius: var(--rt-radius-lg);
228
+ --rt-input-radius: var(--rt-radius-control);
218
229
  --rt-input-padding-x: var(--rt-space-4);
219
230
  --rt-input-padding-y: var(--rt-space-0);
220
231
  --rt-input-border-width: var(--rt-border-width-thin);
@@ -389,9 +400,9 @@
389
400
  @include rt-theme-light-tokens;
390
401
  }
391
402
 
392
- /* На тач-устройствах инпут не меньше 16px: WebKit (весь iOS, включая Chrome)
393
- зумит страницу при фокусе на поле с font-size < 16px — отсюда горизонтальный
394
- сдвиг вёрстки. Десктоп сохраняет плотный 14px. */
403
+ /* On touch devices an input is not smaller than 16px: WebKit (all of iOS, Chrome included)
404
+ zooms the page on focusing a field with font-size < 16px — hence the horizontal
405
+ shift of the layout. The desktop keeps the dense 14px. */
395
406
  @media (pointer: coarse) {
396
407
  :root {
397
408
  --rt-input-font-size: var(--rt-text-md);
@@ -1,19 +1,19 @@
1
- /* Собрано генератором `tools/build-tokens-v2.mjs` из `tokens.source.mjs` — правится там, не здесь:
2
- правка на месте теряется на следующей сборке, и её называет `pnpm run check:tokens-build`. */
1
+ /* Built by the generator `tools/build-tokens-v2.mjs` from `tokens.source.mjs` — edited there, not here:
2
+ an edit on the spot is lost on the next build, and `pnpm run check:tokens-build` names it. */
3
3
 
4
- /* Тёмная тема — переопределение назначений; ступени шкалы неизменны.
4
+ /* The dark theme — an override of the assignments; the scale steps are unchanging.
5
5
 
6
- Тело вынесено в @mixin, чтобы тот же набор переопределений можно было
7
- применить не только на html-уровне (тема приложения), но и к локальному
8
- контейнеру (side-by-side light/dark в Storybook) — без дублирования значений.
6
+ The body is carried into an @mixin so that the same set of overrides could be
7
+ applied not only at the html level (the application's theme) but to a local
8
+ container too (side-by-side light/dark in Storybook) — without duplicating the values.
9
9
 
10
- База (`rt-theme-dark-tokens`) — тёплый графит для приложений и всех
11
- CDK-overlay'ев (асайды/диалоги/меню рендерятся на уровне body, вне
12
- host-классов шеллов — поэтому графит держим на :root, иначе overlay'и
13
- не наследовали бы палитру).
10
+ The base (`rt-theme-dark-tokens`) is warm graphite for the applications and all the
11
+ CDK overlays (asides/dialogs/menus are rendered at the body level, outside the
12
+ shells' host classes — so the graphite is held on :root, otherwise the overlays
13
+ would not inherit the palette).
14
14
 
15
- Значения ответов живут в источнике рядом со своим светлым назначением: забытая половина
16
- пары видна там же, а не вылавливается сверкой двух файлов. */
15
+ The values of the answers live in the source next to their light assignment: a forgotten half of
16
+ a pair is visible right there rather than caught by matching two files. */
17
17
 
18
18
  @mixin rt-theme-dark-tokens {
19
19
  /* Background — тёплый графит */
@@ -134,6 +134,10 @@
134
134
  /* Special — Auth surface (градиентный фон логина + прозрачная карточка). */
135
135
  --rt-color-bg-page-auth: linear-gradient(156deg, var(--rt-neutral-950) 12.68%, var(--rt-navy-900) 99.28%);
136
136
  --rt-color-bg-surface-auth-card: transparent;
137
+
138
+ /* Skeleton — заглушка загрузки: покой и гребень волны. */
139
+ --rt-color-skeleton-base: var(--rt-charcoal-950);
140
+ --rt-color-skeleton-wave: var(--rt-charcoal-border);
137
141
  }
138
142
 
139
143
  :root[data-theme='dark'],