@rt-tools/ui-kit-v2 0.4.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +71 -0
- package/fesm2022/rt-tools-ui-kit-v2.mjs +395 -188
- package/fesm2022/rt-tools-ui-kit-v2.mjs.map +1 -1
- package/package.json +1 -1
- package/rt-tools-ui-kit-v2-0.6.0.tgz +0 -0
- package/src/lib/components/aside/_rt-aside-overlay.scss +73 -71
- package/src/lib/components/aside/footer/rt-aside-footer.component.scss +20 -16
- package/src/lib/components/aside/header/rt-aside-header.component.scss +72 -70
- package/src/lib/components/aside/rt-aside.component.scss +107 -105
- package/src/lib/components/aside/unsaved-dialog/rt-aside-unsaved-dialog.component.scss +33 -31
- package/src/lib/components/aside-section/rt-aside-section.component.scss +27 -23
- package/src/lib/components/autocomplete/rt-autocomplete.component.scss +124 -118
- package/src/lib/components/bar-list/rt-bar-list.component.scss +85 -81
- package/src/lib/components/bottom-sheet/rt-bottom-sheet.component.scss +64 -57
- package/src/lib/components/button/rt-button.directive.scss +319 -280
- package/src/lib/components/calendar/rt-calendar.component.scss +106 -102
- package/src/lib/components/card/rt-card.component.scss +53 -45
- package/src/lib/components/chat/rt-chat.component.scss +312 -306
- package/src/lib/components/checkbox/rt-checkbox.component.scss +61 -54
- package/src/lib/components/collapsible-text/rt-collapsible-text.component.scss +36 -34
- package/src/lib/components/confirm-popover/rt-confirm-popover.component.scss +36 -30
- package/src/lib/components/container/CONTEXT.md +22 -0
- package/src/lib/components/container/rt-container.component.scss +91 -87
- package/src/lib/components/counter/rt-counter.component.scss +14 -12
- package/src/lib/components/counter-row/rt-counter-row.component.scss +31 -27
- package/src/lib/components/date-picker/rt-date-picker.component.scss +73 -71
- package/src/lib/components/delta-view/rt-delta-view.component.scss +27 -25
- package/src/lib/components/detail-list/rt-detail-list.component.scss +8 -6
- package/src/lib/components/detail-list/rt-detail-row.component.scss +18 -16
- package/src/lib/components/dialog/footer/rt-dialog-footer.component.scss +19 -17
- package/src/lib/components/dialog/header/rt-dialog-header.component.scss +27 -25
- package/src/lib/components/dialog/rt-dialog.component.scss +59 -56
- package/src/lib/components/download-link/rt-download-link.component.scss +32 -27
- package/src/lib/components/empty-state/rt-empty-state.component.scss +50 -46
- package/src/lib/components/field/rt-field.component.scss +63 -61
- package/src/lib/components/file-card/rt-file-card.component.scss +84 -78
- package/src/lib/components/file-drop/rt-file-drop.component.scss +83 -77
- package/src/lib/components/file-input/rt-file-input.component.scss +20 -18
- package/src/lib/components/file-list/rt-file-list.component.scss +9 -7
- package/src/lib/components/filter-control/rt-filter-control.component.scss +16 -14
- package/src/lib/components/header/rt-header.component.scss +61 -55
- package/src/lib/components/icon/rt-icon.component.scss +14 -12
- package/src/lib/components/icon-button/CONTEXT.md +4 -2
- package/src/lib/components/icon-button/rt-icon-button.component.scss +128 -112
- package/src/lib/components/info-item/rt-info-item.component.scss +38 -36
- package/src/lib/components/input/rt-input.component.scss +102 -98
- package/src/lib/components/input-number/rt-input-number.component.scss +84 -82
- package/src/lib/components/live-badge/rt-live-badge.component.scss +27 -23
- package/src/lib/components/logo/rt-logo.component.scss +54 -52
- package/src/lib/components/menu/rt-menu-confirm-dialog.component.scss +30 -28
- package/src/lib/components/menu/rt-menu-item.component.scss +47 -42
- package/src/lib/components/menu/rt-menu.component.scss +23 -15
- package/src/lib/components/message/rt-message.component.scss +53 -49
- package/src/lib/components/message-composer/rt-message-composer.component.scss +55 -49
- package/src/lib/components/money-list/rt-money-list.component.scss +13 -9
- package/src/lib/components/money-list/rt-money-row.component.scss +23 -19
- package/src/lib/components/multiselect/rt-multiselect.component.scss +169 -161
- package/src/lib/components/night-grid/rt-night-grid.component.scss +47 -42
- package/src/lib/components/note/rt-note.component.scss +15 -11
- package/src/lib/components/notifications-bell/rt-notifications-bell.component.scss +34 -27
- package/src/lib/components/page-header/rt-page-header-mobile.scss +142 -134
- package/src/lib/components/page-header/rt-page-header-submenu.scss +130 -123
- package/src/lib/components/page-header/rt-page-header.component.scss +221 -210
- package/src/lib/components/pagination/rt-pagination.component.scss +88 -81
- package/src/lib/components/photo-viewer/rt-photo-viewer.component.scss +109 -105
- package/src/lib/components/rich-editor/rt-rich-editor.component.scss +63 -59
- package/src/lib/components/section-nav/rt-section-nav.component.scss +53 -47
- package/src/lib/components/select/rt-select.component.scss +146 -138
- package/src/lib/components/skeleton/rt-skeleton.component.scss +50 -41
- package/src/lib/components/skeleton-wrapper/rt-skeleton-wrapper.component.scss +8 -6
- package/src/lib/components/spinner/rt-spinner.component.scss +35 -32
- package/src/lib/components/split-button/rt-split-button.component.scss +74 -62
- package/src/lib/components/stat-tile/rt-stat-tile.component.scss +95 -91
- package/src/lib/components/stepper/rt-stepper.component.scss +107 -101
- package/src/lib/components/table/copy-cell/rt-copy-cell.component.scss +34 -30
- package/src/lib/components/table/rt-table.component.scss +260 -252
- package/src/lib/components/table/settings-aside/rt-table-settings-aside.component.scss +7 -5
- package/src/lib/components/table/settings-panel/rt-table-settings-panel.component.scss +71 -61
- package/src/lib/components/table/sort-header/CONTEXT.md +40 -0
- package/src/lib/components/table/sort-header/rt-table-sort-header.component.scss +31 -29
- package/src/lib/components/tabs/CONTEXT.md +5 -0
- package/src/lib/components/tabs/rt-tabs.component.scss +184 -175
- package/src/lib/components/tag/rt-tag.component.scss +97 -92
- package/src/lib/components/textarea/rt-textarea.component.scss +62 -60
- package/src/lib/components/theme-toggle/rt-theme-toggle.component.scss +7 -5
- package/src/lib/components/thread-list/rt-thread-list.component.scss +221 -212
- package/src/lib/components/timeline/rt-timeline.component.scss +82 -76
- package/src/lib/components/toast/CONTEXT.md +8 -0
- package/src/lib/components/toast/rt-toast.component.scss +169 -160
- package/src/lib/components/toast/rt-toaster.component.scss +37 -35
- package/src/lib/components/toggle-button-group/rt-toggle-button-group.component.scss +129 -122
- package/src/lib/components/toggle-switch/rt-toggle-switch.component.scss +97 -91
- package/src/lib/components/toolbar/rt-toolbar.component.scss +56 -54
- package/src/lib/components/tooltip/rt-tooltip.component.scss +20 -15
- package/src/lib/components/welcome-dialog/rt-welcome-dialog.component.scss +46 -44
- package/src/lib/components/workspace/rt-workspace.component.scss +139 -131
- package/src/lib/components/workspace-details/rt-workspace-details.component.scss +105 -101
- package/src/styles/_index.scss +4 -0
- package/src/styles/_layers.scss +22 -0
- package/src/styles/_login.scss +87 -85
- package/src/styles/_mixins.scss +1 -1
- package/src/styles/_primitives.scss +126 -67
- package/src/styles/_scrollbar.scss +21 -19
- package/src/styles/_semantic.scss +140 -56
- package/src/styles/_theme-dark.scss +60 -27
- package/styles/tokens.css +628 -408
- package/types/rt-tools-ui-kit-v2.d.ts +9 -16
- package/rt-tools-ui-kit-v2-0.4.0.tgz +0 -0
package/styles/tokens.css
CHANGED
|
@@ -1,40 +1,75 @@
|
|
|
1
1
|
@charset "UTF-8";
|
|
2
|
+
/* Порядок подслоёв кита. Объявляется раньше всего остального: слой, не названный здесь,
|
|
3
|
+
встаёт в каскад по первому появлению, а появляются подслои в порядке загрузки — стили
|
|
4
|
+
компонента Angular инжектит отдельным блоком, и он способен прийти раньше основы. Названные
|
|
5
|
+
заранее, оба подслоя держат порядок независимо от того, что загрузилось первым.
|
|
6
|
+
|
|
7
|
+
Правило приложения, объявленное вне слоя, выигрывает у любого правила отсюда независимо от
|
|
8
|
+
специфичности: неслоевое правило сильнее слоевого. Ради этого слой и заводится — перебивать
|
|
9
|
+
кит счётом специфичности потребителю больше не нужно.
|
|
10
|
+
|
|
11
|
+
Объявления свойств на корне страницы (`:root { --rt-* }`) в слой не уходят: их потребитель
|
|
12
|
+
перебивает порядком, объявляя свою линейку бренда после `tokens.css`.
|
|
13
|
+
|
|
14
|
+
Нижний подслой — `vendor`, и он для чужого CSS, который чинит кит: тема редактора текста,
|
|
15
|
+
готовые стили перекрытия. Слой опускает правила кита ниже всего, что объявлено вне слоя, —
|
|
16
|
+
не только ниже приложения, но и ниже такой библиотеки, и панель редактора перестраивалась
|
|
17
|
+
молча. Подключается чужой файл импортом с именем подслоя:
|
|
18
|
+
|
|
19
|
+
@import 'quill/dist/quill.snow.css' layer(rt-kit.vendor);
|
|
20
|
+
|
|
21
|
+
Кит его за потребителя не подключает: редактор текста опционален, и тянуть его тему в
|
|
22
|
+
пакет значило бы отдать её всем. */
|
|
23
|
+
@layer rt-kit.vendor, rt-kit.base, rt-kit.components;
|
|
2
24
|
/* Primitive design tokens — single source of truth для шкал. */
|
|
3
25
|
:root {
|
|
4
|
-
/* Neutral scale — серо-сине-стальная.
|
|
26
|
+
/* Neutral scale — серо-сине-стальная.
|
|
27
|
+
|
|
28
|
+
Ряд посчитан в OKLCH: тон 264.4° и цветность 0.0234 взяты у прежней ступени 600,
|
|
29
|
+
светлота идёт ровным шагом 0.0785 от 0.985 к 0.20. Ноль остаётся чистым белым —
|
|
30
|
+
это бумага, а не ступень ряда. В самом светлом конце цветность ужата охватом
|
|
31
|
+
sRGB: синеватого такой светлоты не существует.
|
|
32
|
+
|
|
33
|
+
До пересчёта ряд шкалой не был. Он держал два семейства сразу — чисто серое
|
|
34
|
+
(0, 50, 200, 500, 900) и синеватое (100, 300, 400, 600, 700, 800, 950), —
|
|
35
|
+
шаг светлоты гулял от 0.009 до 0.173, а ступень 900 была темнее ступени 950,
|
|
36
|
+
то есть ряд шёл назад. Ещё девять ступеней стояли между этими: заведённые под
|
|
37
|
+
одно место, они выглядели шкалой, но выбрать из такого ряда было нельзя. */
|
|
5
38
|
--rt-neutral-0: #fff;
|
|
6
|
-
--rt-neutral-50: #
|
|
7
|
-
--rt-neutral-100: #
|
|
8
|
-
--rt-neutral-
|
|
9
|
-
--rt-neutral-
|
|
10
|
-
--rt-neutral-
|
|
11
|
-
--rt-neutral-
|
|
12
|
-
--rt-neutral-
|
|
13
|
-
--rt-neutral-
|
|
14
|
-
--rt-neutral-
|
|
15
|
-
--rt-neutral-
|
|
16
|
-
--rt-neutral-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
--rt-
|
|
26
|
-
--rt-
|
|
27
|
-
--rt-
|
|
28
|
-
|
|
29
|
-
--rt-
|
|
30
|
-
--rt-
|
|
31
|
-
--rt-
|
|
32
|
-
--rt-
|
|
33
|
-
--rt-
|
|
34
|
-
--rt-
|
|
35
|
-
--rt-
|
|
36
|
-
|
|
37
|
-
|
|
39
|
+
--rt-neutral-50: #f8faff;
|
|
40
|
+
--rt-neutral-100: #d8e0f0;
|
|
41
|
+
--rt-neutral-200: #bfc7d6;
|
|
42
|
+
--rt-neutral-300: #a6aebd;
|
|
43
|
+
--rt-neutral-400: #8e96a4;
|
|
44
|
+
--rt-neutral-500: #777e8c;
|
|
45
|
+
--rt-neutral-600: #606775;
|
|
46
|
+
--rt-neutral-700: #4b515f;
|
|
47
|
+
--rt-neutral-800: #363c49;
|
|
48
|
+
--rt-neutral-900: #232934;
|
|
49
|
+
--rt-neutral-950: #111621;
|
|
50
|
+
/* Бренд — линейка цвета марки. Потребитель перекрашивает кит объявлением этих
|
|
51
|
+
одиннадцати ступеней после tokens.css: назначения, прозрачные оттенки и кольцо
|
|
52
|
+
фокуса берут цвет отсюда сами, в обеих темах.
|
|
53
|
+
|
|
54
|
+
Ряд посчитан в OKLCH: тон 262.87° и цветность взяты у ступени 500, светлота идёт
|
|
55
|
+
ровными шагами от 0.97 к 0.20. Ступень 500 — сам цвет марки, поэтому светлый конец
|
|
56
|
+
ряда темнее, чем у палитр, где 500 стоит серединой светлоты. У 600 и 700 цветность
|
|
57
|
+
ужата: с полной они не влезают в охват sRGB. */
|
|
58
|
+
--rt-brand-50: #f0f5ff;
|
|
59
|
+
--rt-brand-100: #cddaf1;
|
|
60
|
+
--rt-brand-200: #a8bfea;
|
|
61
|
+
--rt-brand-300: #7ea3e9;
|
|
62
|
+
--rt-brand-400: #4e84f2; /* отметка прочтения в чате */
|
|
63
|
+
--rt-brand-500: #155dfc; /* цвет марки */
|
|
64
|
+
--rt-brand-600: #0047df;
|
|
65
|
+
--rt-brand-700: #0038b5;
|
|
66
|
+
--rt-brand-800: #012a8a;
|
|
67
|
+
--rt-brand-900: #021d62;
|
|
68
|
+
--rt-brand-950: #02113c;
|
|
69
|
+
/* Navy — тёмная синева обвязки и рельсы прогресса. Цветом марки она не красится:
|
|
70
|
+
перекрасивший бренд не ждёт, что вместе с кнопкой сменится подложка шапки. */
|
|
71
|
+
--rt-navy-600: #435775; /* трек прогресса, тёмная тема */
|
|
72
|
+
--rt-navy-900: #182142; /* подложка шапки и боковой навигации */
|
|
38
73
|
/* Charcoal — тёплый графит для тёмной темы. */
|
|
39
74
|
--rt-charcoal-950: #17181c; /* глубокий фон / приподнятая alt-поверхность, subtle */
|
|
40
75
|
--rt-charcoal-900: #1b1f22; /* фон страницы */
|
|
@@ -44,42 +79,49 @@
|
|
|
44
79
|
--rt-charcoal-border-strong: #444a50; /* усиленная граница */
|
|
45
80
|
/* Stepper rail — приглушённые оттенки трека/прогресса прогресс-полосы. */
|
|
46
81
|
--rt-gray-350: #b3b3b3; /* трек, light */
|
|
47
|
-
--rt-navy-600: #435775; /* трек, dark */
|
|
48
82
|
--rt-slate-300: #a9b8cd; /* пройденный прогресс, dark */
|
|
49
|
-
/* Status — success/warning/danger/info
|
|
83
|
+
/* Status — success/warning/danger/info.
|
|
84
|
+
|
|
85
|
+
Ступени 600 и 700 считаны от своей 500 ровным шагом светлоты линейки бренда
|
|
86
|
+
(ΔL = 0.0687 в OKLCH): тон и цветность берутся у 500, светлота убывает шагом.
|
|
87
|
+
До этого ряды были собраны вручную и шли неровно — у успеха 700 была светлее
|
|
88
|
+
600, а у опасности 600 отличалась от 500 неразличимо на глаз. Наведение и
|
|
89
|
+
нажатие действия берут именно эти ступени, и такая пара их сливала. */
|
|
50
90
|
--rt-success-50: #ecfdf5;
|
|
51
91
|
--rt-success-100: #eafaf5;
|
|
52
92
|
--rt-success-500: #059669;
|
|
53
|
-
--rt-success-600: #
|
|
54
|
-
--rt-success-700: #
|
|
93
|
+
--rt-success-600: #017f58;
|
|
94
|
+
--rt-success-700: #006848;
|
|
55
95
|
--rt-warning-50: #fffbeb;
|
|
56
96
|
--rt-warning-500: #d97706;
|
|
57
|
-
--rt-warning-600: #
|
|
97
|
+
--rt-warning-600: #bc6600;
|
|
98
|
+
--rt-warning-700: #9f5500;
|
|
58
99
|
--rt-yellow-400: #f4d85a;
|
|
59
100
|
--rt-amber-400: #f49f5a;
|
|
60
101
|
--rt-danger-50: #fef2f2;
|
|
61
102
|
--rt-danger-500: #dc2626;
|
|
62
|
-
--rt-danger-600: #
|
|
63
|
-
--rt-danger-700: #
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
103
|
+
--rt-danger-600: #c00111;
|
|
104
|
+
--rt-danger-700: #9e000c;
|
|
105
|
+
/* Info разведён с маркой намеренно. До этого две палитры стояли на одном тоне —
|
|
106
|
+
262.9° у обеих, — различаясь только цветностью, а ступень 700 совпадала с
|
|
107
|
+
брендовой буквально. Уведомление «к сведению» — статус наравне с успехом и
|
|
108
|
+
опасностью, а не акцент марки: у потребителя с зелёной маркой оно иначе стало
|
|
109
|
+
бы неотличимо от успешного. Тон уведён к 250°: дальше охват sRGB режет
|
|
110
|
+
цветность вдвое, и синий уходит в бирюзу. */
|
|
111
|
+
--rt-info-50: #eef6ff;
|
|
112
|
+
--rt-info-500: #0173c6;
|
|
113
|
+
--rt-info-600: #005fa5;
|
|
114
|
+
--rt-info-700: #004c85;
|
|
115
|
+
/* Spacing — ряд с шагом 4px. Промежуточных ступеней в нём нет: 6, 10, 12 и 28
|
|
116
|
+
пикселей стояли ступенями под конкретные места, и выбрать из такого ряда было
|
|
117
|
+
нельзя. Употребления округлены к ближайшей ступени, при равенстве — вверх. */
|
|
68
118
|
--rt-space-0: 0;
|
|
69
119
|
--rt-space-0-5: 2px;
|
|
70
120
|
--rt-space-1: 4px;
|
|
71
|
-
/* @deprecated off-grid — округлять к --rt-space-2 (8) или --rt-space-1 (4). */
|
|
72
|
-
--rt-space-1-5: 6px;
|
|
73
121
|
--rt-space-2: 8px;
|
|
74
|
-
/* @deprecated off-grid — округлять к --rt-space-2 (8) или --rt-space-md (16). */
|
|
75
|
-
--rt-space-2-5: 10px;
|
|
76
|
-
/* @deprecated off-grid — округлять к --rt-space-md (16). */
|
|
77
|
-
--rt-space-3: 12px;
|
|
78
122
|
--rt-space-4: 16px;
|
|
79
123
|
--rt-space-5: 20px;
|
|
80
124
|
--rt-space-6: 24px;
|
|
81
|
-
/* @deprecated off-grid — заведён под промежуток между группами панели навигации. */
|
|
82
|
-
--rt-space-7: 28px;
|
|
83
125
|
--rt-space-8: 32px;
|
|
84
126
|
--rt-space-10: 40px;
|
|
85
127
|
--rt-space-12: 48px;
|
|
@@ -142,11 +184,42 @@
|
|
|
142
184
|
/* Тень попапа профиля — один плотный слой: панель узкая, и рассеянные слои
|
|
143
185
|
панели навигации размазывают её край вместо того, чтобы его очертить. */
|
|
144
186
|
--rt-shadow-profile-menu: 0 16px 32px rgb(0 0 0 / 15%);
|
|
145
|
-
/*
|
|
146
|
-
|
|
147
|
-
--rt-
|
|
148
|
-
|
|
149
|
-
|
|
187
|
+
/* Тень окна — тот же силуэт, что у shadow-card-soft, но вдвое плотнее: окно
|
|
188
|
+
лежит поверх затемнённой страницы, и слабый ореол на ней не читается. */
|
|
189
|
+
--rt-shadow-dialog: 0 0 40px rgb(0 0 0 / 25%);
|
|
190
|
+
/* Size — шкала габаритов: ширина, высота и сторона квадратного узла там, где их
|
|
191
|
+
задаёт не содержимое. Множитель тот же, что у отступов: ступень N равна N × 4px,
|
|
192
|
+
и ряд идёт без промежуточных ступеней — габарит, не легший на ряд, округляется к
|
|
193
|
+
соседней, а не заводит себе ступень по месту. */
|
|
194
|
+
--rt-size-1: 4px;
|
|
195
|
+
--rt-size-2: 8px;
|
|
196
|
+
--rt-size-3: 12px;
|
|
197
|
+
--rt-size-4: 16px;
|
|
198
|
+
--rt-size-5: 20px;
|
|
199
|
+
--rt-size-6: 24px;
|
|
200
|
+
--rt-size-8: 32px;
|
|
201
|
+
--rt-size-10: 40px;
|
|
202
|
+
--rt-size-12: 48px;
|
|
203
|
+
--rt-size-16: 64px;
|
|
204
|
+
--rt-size-20: 80px;
|
|
205
|
+
--rt-size-24: 96px;
|
|
206
|
+
--rt-size-30: 120px;
|
|
207
|
+
--rt-size-40: 160px;
|
|
208
|
+
--rt-size-60: 240px;
|
|
209
|
+
--rt-size-64: 256px;
|
|
210
|
+
--rt-size-100: 400px;
|
|
211
|
+
/* Control height — одна шкала высот на все интерактивные контролы: кнопку,
|
|
212
|
+
иконочную кнопку и семейство полей. Ряд идёт шагом 8px и ложится на сетку
|
|
213
|
+
отступов; ступень md остаётся сорока, потому что это самый ходовой размер
|
|
214
|
+
кнопки.
|
|
215
|
+
|
|
216
|
+
До свода рядов было три, и в одной строке они не совпадали: кнопка шла
|
|
217
|
+
30/40/50/60/70, поле 36/45/52, иконочная кнопка 28/36/44/52/60. */
|
|
218
|
+
--rt-control-height-sm: 32px;
|
|
219
|
+
--rt-control-height-md: 40px;
|
|
220
|
+
--rt-control-height-lg: 48px;
|
|
221
|
+
--rt-control-height-xl: 56px;
|
|
222
|
+
--rt-control-height-2xl: 64px;
|
|
150
223
|
--rt-control-textarea-min-height-sm: 80px;
|
|
151
224
|
--rt-control-textarea-min-height-md: 120px;
|
|
152
225
|
--rt-control-textarea-min-height-lg: 160px;
|
|
@@ -171,10 +244,17 @@
|
|
|
171
244
|
--rt-overlay-white-25: rgb(250 250 250 / 25%); /* disabled-текст на графите */
|
|
172
245
|
--rt-overlay-white-40: rgb(250 250 250 / 40%); /* muted-текст на графите */
|
|
173
246
|
--rt-overlay-black-50: rgb(0 0 0 / 50%);
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
--rt-overlay-
|
|
247
|
+
/* Оттенки марки считаются от её ступени, а не повторяют код цвета: повторённое
|
|
248
|
+
значение расходится с источником молча, и перекрасивший бренд получал бы прежний
|
|
249
|
+
синий в подложке действия и в кольце фокуса. */
|
|
250
|
+
--rt-overlay-brand-8: color-mix(in srgb, var(--rt-brand-500) 8%, transparent);
|
|
251
|
+
--rt-overlay-brand-24: color-mix(in srgb, var(--rt-brand-500) 24%, transparent);
|
|
252
|
+
--rt-overlay-danger-16: color-mix(in srgb, var(--rt-danger-500) 16%, transparent);
|
|
253
|
+
--rt-overlay-amber-16: color-mix(in srgb, var(--rt-amber-400) 16%, transparent);
|
|
254
|
+
/* Подложка окна — синеватая, а не чёрная: окно стоит на странице обвязки, и
|
|
255
|
+
чёрное затемнение под ним холоднее её синевы. Считается от ступени обвязки
|
|
256
|
+
по той же причине, что и оттенки марки. */
|
|
257
|
+
--rt-overlay-navy-70: color-mix(in srgb, var(--rt-navy-900) 70%, transparent);
|
|
178
258
|
/* Z-index */
|
|
179
259
|
--rt-z-base: 0;
|
|
180
260
|
--rt-z-dropdown: 1000;
|
|
@@ -208,34 +288,106 @@
|
|
|
208
288
|
--rt-color-bg-subtle: var(--rt-neutral-100);
|
|
209
289
|
--rt-color-bg-overlay: var(--rt-overlay-black-50);
|
|
210
290
|
--rt-color-bg-inverse: var(--rt-neutral-900);
|
|
291
|
+
/* Подложка обвязки — шапка и боковая навигация. Отдельно от bg-inverse: тот
|
|
292
|
+
нейтральный и работает под перевёрнутым текстом, а этот синеватый и в обеих
|
|
293
|
+
темах один. */
|
|
294
|
+
--rt-color-bg-nav: var(--rt-navy-900); /* rt-theme-shared: обвязка тёмная в обеих темах */
|
|
211
295
|
/* Text */
|
|
212
296
|
--rt-color-text-primary: var(--rt-neutral-900);
|
|
213
|
-
|
|
297
|
+
/* Ступень 600, а не 500: приглушённый текст обязан брать порог, а после
|
|
298
|
+
пересчёта ряда самая светлая ступень, которая его берёт, — шестисотая.
|
|
299
|
+
Прежде эту роль держала off-grid ступень 510, заведённая ровно под неё. */
|
|
300
|
+
--rt-color-text-muted: var(--rt-neutral-600);
|
|
214
301
|
--rt-color-text-disabled: var(--rt-neutral-400);
|
|
215
302
|
--rt-color-text-inverse: var(--rt-neutral-0);
|
|
216
|
-
--rt-color-text-link: var(--rt-
|
|
217
|
-
--rt-color-text-link-hover: var(--rt-
|
|
303
|
+
--rt-color-text-link: var(--rt-brand-500);
|
|
304
|
+
--rt-color-text-link-hover: var(--rt-brand-600);
|
|
218
305
|
/* Border */
|
|
219
306
|
--rt-color-border-default: var(--rt-neutral-200);
|
|
220
307
|
--rt-color-border-strong: var(--rt-neutral-300);
|
|
221
308
|
--rt-color-border-subtle: var(--rt-neutral-200);
|
|
222
|
-
--rt-color-border-focus: var(--rt-
|
|
223
|
-
/* Action
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
309
|
+
--rt-color-border-focus: var(--rt-brand-500);
|
|
310
|
+
/* Action — роли действия.
|
|
311
|
+
|
|
312
|
+
Роль это пятёрка: подложка, наведение, нажатие, подпись на них и цвет самой
|
|
313
|
+
роли на поверхности. Кнопка берёт роль целиком и своих цветов не знает вовсе,
|
|
314
|
+
поэтому смена роли — одна строка здесь, а не правка стилей компонента.
|
|
315
|
+
Наведение и нажатие — соседние ступени своей шкалы; подпись светлая у всех
|
|
316
|
+
ролей, потому что все подложки тёмные.
|
|
317
|
+
|
|
318
|
+
Пятый член — `-on-surface` — красит безфоновые оформления: текстовое и
|
|
319
|
+
обводочное берут им подпись и рамку. Отдельным именем, а не подложкой роли:
|
|
320
|
+
подложка вправе быть поверхностью, и у вторичной роли на графите она ею
|
|
321
|
+
становится — подпись, взятая из подложки, легла бы сама на себя. У пяти ролей
|
|
322
|
+
цвет тот же, что и у подложки, и это записано ссылкой, а не повтором
|
|
323
|
+
значения. */
|
|
324
|
+
--rt-color-action-primary: var(--rt-brand-500); /* rt-theme-shared: цвет марки один в обеих темах */
|
|
325
|
+
--rt-color-action-primary-hover: var(--rt-brand-600); /* rt-theme-shared: цвет марки один в обеих темах */
|
|
326
|
+
--rt-color-action-primary-active: var(--rt-brand-700); /* rt-theme-shared: цвет марки один в обеих темах */
|
|
327
|
+
--rt-color-action-primary-subtle: var(--rt-overlay-brand-8);
|
|
227
328
|
/* Focus-ring tint — насыщеннее subtle, для visible 3px outline. */
|
|
228
|
-
--rt-color-action-primary-soft: var(--rt-overlay-
|
|
229
|
-
--rt-color-action-on-primary: var(--rt-neutral-0);
|
|
230
|
-
--rt-color-action-
|
|
231
|
-
|
|
329
|
+
--rt-color-action-primary-soft: var(--rt-overlay-brand-24);
|
|
330
|
+
--rt-color-action-on-primary: var(--rt-neutral-0); /* rt-theme-shared: подпись на действии марки светлая в обеих темах */
|
|
331
|
+
--rt-color-action-primary-on-surface: var(--rt-color-action-primary);
|
|
332
|
+
/* Вторичное действие — единственная роль без своего цвета: она нейтральна и на
|
|
333
|
+
графите разворачивается в подложку поверхности, поэтому тёмная тема отвечает
|
|
334
|
+
на всю её тройку. По той же причине пятый член у неё свой: подложкой роли на
|
|
335
|
+
графите красить подпись нечем. */
|
|
336
|
+
--rt-color-action-secondary: var(--rt-neutral-600);
|
|
337
|
+
--rt-color-action-secondary-hover: var(--rt-neutral-700);
|
|
338
|
+
--rt-color-action-secondary-active: var(--rt-neutral-800);
|
|
339
|
+
--rt-color-action-on-secondary: var(--rt-neutral-0);
|
|
340
|
+
--rt-color-action-secondary-on-surface: var(--rt-neutral-600);
|
|
341
|
+
--rt-color-action-success: var(--rt-success-500); /* rt-theme-shared: цвет роли один в обеих темах */
|
|
342
|
+
--rt-color-action-success-hover: var(--rt-success-600); /* rt-theme-shared: цвет роли один в обеих темах */
|
|
343
|
+
--rt-color-action-success-active: var(--rt-success-700); /* rt-theme-shared: цвет роли один в обеих темах */
|
|
344
|
+
--rt-color-action-on-success: var(--rt-neutral-0); /* rt-theme-shared: подпись на цветной подложке светлая в обеих темах */
|
|
345
|
+
--rt-color-action-success-on-surface: var(--rt-color-action-success);
|
|
346
|
+
--rt-color-action-warning: var(--rt-warning-500); /* rt-theme-shared: цвет роли один в обеих темах */
|
|
347
|
+
--rt-color-action-warning-hover: var(--rt-warning-600); /* rt-theme-shared: цвет роли один в обеих темах */
|
|
348
|
+
--rt-color-action-warning-active: var(--rt-warning-700); /* rt-theme-shared: цвет роли один в обеих темах */
|
|
349
|
+
--rt-color-action-on-warning: var(--rt-neutral-0); /* rt-theme-shared: подпись на цветной подложке светлая в обеих темах */
|
|
350
|
+
--rt-color-action-warning-on-surface: var(--rt-color-action-warning);
|
|
351
|
+
--rt-color-action-danger: var(--rt-danger-500); /* rt-theme-shared: цвет роли один в обеих темах */
|
|
352
|
+
--rt-color-action-danger-hover: var(--rt-danger-600); /* rt-theme-shared: цвет роли один в обеих темах */
|
|
353
|
+
--rt-color-action-danger-active: var(--rt-danger-700); /* rt-theme-shared: цвет роли один в обеих темах */
|
|
354
|
+
--rt-color-action-on-danger: var(--rt-neutral-0); /* rt-theme-shared: подпись на цветной подложке светлая в обеих темах */
|
|
355
|
+
--rt-color-action-danger-on-surface: var(--rt-color-action-danger);
|
|
356
|
+
--rt-color-action-info: var(--rt-info-500); /* rt-theme-shared: цвет роли один в обеих темах */
|
|
357
|
+
--rt-color-action-info-hover: var(--rt-info-600); /* rt-theme-shared: цвет роли один в обеих темах */
|
|
358
|
+
--rt-color-action-info-active: var(--rt-info-700); /* rt-theme-shared: цвет роли один в обеих темах */
|
|
359
|
+
--rt-color-action-on-info: var(--rt-neutral-0); /* rt-theme-shared: подпись на цветной подложке светлая в обеих темах */
|
|
360
|
+
--rt-color-action-info-on-surface: var(--rt-color-action-info);
|
|
361
|
+
/* Отключённое действие — своя пара, а не вторичная роль: делить подложку с ней
|
|
362
|
+
значит сделать отключённую вторичную кнопку неотличимой от доступной. */
|
|
363
|
+
--rt-color-action-disabled: var(--rt-neutral-200);
|
|
364
|
+
--rt-color-action-on-disabled: var(--rt-color-text-disabled);
|
|
365
|
+
/* Доли оттенка под наведение и нажатие безфоновых оформлений кнопки. Живут в
|
|
366
|
+
слое, а не в стилях компонента: тёмная тема их поднимает, а половина пары,
|
|
367
|
+
оставшаяся в компоненте, тёмному ответу не видна. */
|
|
368
|
+
--rt-btn-tint-hover: 8%;
|
|
369
|
+
--rt-btn-tint-active: 16%;
|
|
370
|
+
/* Кольцо фокуса разобрано на составляющие: толщину, отступ и цвет. Композит
|
|
371
|
+
собирается из них и остаётся на месте — восемь компонентов берут его целиком, и
|
|
372
|
+
менять их незачем. Отступ — зазор цвета поверхности между элементом и кольцом:
|
|
373
|
+
первая тень при нулевом отступе не рисует ничего. */
|
|
374
|
+
--rt-focus-ring-width: var(--rt-border-width-thick);
|
|
375
|
+
/* Ноль с единицей намеренно: безразмерный ноль внутри calc с длиной невалиден, и
|
|
376
|
+
браузер отбрасывает объявление кольца целиком — кольцо просто пропадает. */
|
|
377
|
+
--rt-focus-ring-offset: 0px;
|
|
378
|
+
--rt-focus-ring-color: var(--rt-color-action-primary-soft);
|
|
379
|
+
--rt-focus-ring-color-danger: var(--rt-overlay-danger-16); /* rt-theme-shared: оттенок опасного действия один в обеих темах */
|
|
232
380
|
/* Focus-ring composite — для interactive элементов с custom focus-visible. */
|
|
233
|
-
--rt-shadow-focus-ring:
|
|
234
|
-
|
|
381
|
+
--rt-shadow-focus-ring:
|
|
382
|
+
0 0 0 var(--rt-focus-ring-offset) var(--rt-color-bg-surface),
|
|
383
|
+
0 0 0 calc(var(--rt-focus-ring-offset) + var(--rt-focus-ring-width)) var(--rt-focus-ring-color);
|
|
384
|
+
--rt-shadow-focus-ring-danger:
|
|
385
|
+
0 0 0 var(--rt-focus-ring-offset) var(--rt-color-bg-surface),
|
|
386
|
+
0 0 0 calc(var(--rt-focus-ring-offset) + var(--rt-focus-ring-width)) var(--rt-focus-ring-color-danger);
|
|
235
387
|
/* Stepper (rt-stepper) — рельса прогресса. Текущий шаг — янтарный (одинаков
|
|
236
388
|
в обеих темах); трек/прогресс переопределяются в dark на приглушённые. */
|
|
237
|
-
--rt-color-stepper-current: var(--rt-amber-400);
|
|
238
|
-
--rt-color-stepper-current-subtle: var(--rt-overlay-amber-16);
|
|
389
|
+
--rt-color-stepper-current: var(--rt-amber-400); /* rt-theme-shared: янтарь текущего шага один в обеих темах */
|
|
390
|
+
--rt-color-stepper-current-subtle: var(--rt-overlay-amber-16); /* rt-theme-shared: янтарь текущего шага один в обеих темах */
|
|
239
391
|
--rt-color-stepper-track: var(--rt-gray-350);
|
|
240
392
|
--rt-color-stepper-progress: var(--rt-color-action-primary);
|
|
241
393
|
/* Step-indicator ring — halo вокруг активного пункта rt-stepper. */
|
|
@@ -243,29 +395,32 @@
|
|
|
243
395
|
/* Status-dot ring — halo вокруг точки «объект занят сейчас». */
|
|
244
396
|
--rt-shadow-status-dot: 0 0 0 3px var(--rt-color-state-success-bg);
|
|
245
397
|
/* State */
|
|
246
|
-
--rt-color-state-success: var(--rt-success-500);
|
|
398
|
+
--rt-color-state-success: var(--rt-success-500); /* rt-theme-shared: цвет статуса один в обеих темах */
|
|
247
399
|
--rt-color-state-success-bg: var(--rt-success-50);
|
|
248
|
-
--rt-color-state-warning: var(--rt-warning-500);
|
|
400
|
+
--rt-color-state-warning: var(--rt-warning-500); /* rt-theme-shared: цвет статуса один в обеих темах */
|
|
249
401
|
--rt-color-state-warning-bg: var(--rt-warning-50);
|
|
250
|
-
|
|
402
|
+
/* Подпись на подложке предупреждения — ступенью темнее самого статуса: сам
|
|
403
|
+
статус на своей подложке порога контраста не берёт. Пара к error-text. */
|
|
404
|
+
--rt-color-state-warning-text: var(--rt-warning-600);
|
|
405
|
+
--rt-color-state-danger: var(--rt-danger-500); /* rt-theme-shared: цвет статуса один в обеих темах */
|
|
251
406
|
--rt-color-state-danger-bg: var(--rt-danger-50);
|
|
252
407
|
--rt-color-state-error-text: var(--rt-danger-600);
|
|
253
|
-
--rt-color-state-info: var(--rt-info-500);
|
|
408
|
+
--rt-color-state-info: var(--rt-info-500); /* rt-theme-shared: цвет статуса один в обеих темах */
|
|
254
409
|
--rt-color-state-info-bg: var(--rt-info-50);
|
|
255
410
|
/* Chat — пузыри переписки. Входящее и своё различаются фоном, а не рамкой:
|
|
256
411
|
рамка на каждом пузыре дробит ленту. Отметка прочтения синяя — единственный
|
|
257
412
|
цветной элемент подвала пузыря, остальные статусы приглушены. */
|
|
258
|
-
--rt-chat-bubble-in-bg: var(--rt-
|
|
259
|
-
--rt-chat-bubble-in-author: var(--rt-
|
|
413
|
+
--rt-chat-bubble-in-bg: var(--rt-brand-50);
|
|
414
|
+
--rt-chat-bubble-in-author: var(--rt-brand-700);
|
|
260
415
|
--rt-chat-bubble-own-bg: var(--rt-neutral-100);
|
|
261
416
|
--rt-chat-bubble-own-author: var(--rt-neutral-500);
|
|
262
417
|
--rt-chat-bubble-date: var(--rt-color-text-muted);
|
|
263
|
-
--rt-chat-status-read: var(--rt-
|
|
418
|
+
--rt-chat-status-read: var(--rt-brand-400);
|
|
264
419
|
/* Special — Auth surface (gradient bg + transparent card в dark) */
|
|
265
420
|
--rt-color-bg-page-auth: var(--rt-neutral-50);
|
|
266
421
|
--rt-color-bg-surface-auth-card: var(--rt-neutral-0);
|
|
267
422
|
/* Spacing aliases — named semantic aliases на primitive numeric scale */
|
|
268
|
-
--rt-space-2xs: 2px
|
|
423
|
+
--rt-space-2xs: var(--rt-space-0-5); /* 2px */
|
|
269
424
|
--rt-space-xs: var(--rt-space-1); /* 4px */
|
|
270
425
|
--rt-space-sm: var(--rt-space-2); /* 8px */
|
|
271
426
|
--rt-space-md: var(--rt-space-4); /* 16px */
|
|
@@ -274,7 +429,7 @@
|
|
|
274
429
|
--rt-space-2xl: var(--rt-space-12); /* 48px */
|
|
275
430
|
--rt-space-3xl: var(--rt-space-16); /* 64px */
|
|
276
431
|
/* Text size base — semantic alias для default body text */
|
|
277
|
-
--rt-text-base:
|
|
432
|
+
--rt-text-base: var(--rt-text-md);
|
|
278
433
|
/* Form input — composition tokens. Единый контракт для всего input-семейства
|
|
279
434
|
(rt-input, rt-input-number, rt-autocomplete, rt-select, rt-multiselect,
|
|
280
435
|
rt-textarea). Namespace --rt-input-* / --rt-textarea-*. Компоненты
|
|
@@ -298,7 +453,7 @@
|
|
|
298
453
|
--rt-input-max-width: var(--rt-control-max-width);
|
|
299
454
|
/* Radius / spacing / border */
|
|
300
455
|
--rt-input-radius: var(--rt-radius-lg);
|
|
301
|
-
--rt-input-padding-x: var(--rt-space-
|
|
456
|
+
--rt-input-padding-x: var(--rt-space-4);
|
|
302
457
|
--rt-input-padding-y: var(--rt-space-0);
|
|
303
458
|
--rt-input-border-width: var(--rt-border-width-thin);
|
|
304
459
|
--rt-input-focus-outline-offset: var(--rt-border-width-thin);
|
|
@@ -326,7 +481,7 @@
|
|
|
326
481
|
набирается табличными цифрами и держит ширину, иначе кнопки прыгают
|
|
327
482
|
при переходе через десяток. */
|
|
328
483
|
--rt-counter-gap: var(--rt-space-sm);
|
|
329
|
-
--rt-counter-value-min-width:
|
|
484
|
+
--rt-counter-value-min-width: var(--rt-size-6);
|
|
330
485
|
--rt-counter-value-font-size: var(--rt-text-md);
|
|
331
486
|
--rt-counter-value-color: var(--rt-color-text-primary);
|
|
332
487
|
--rt-counter-row-gap: var(--rt-space-md);
|
|
@@ -341,93 +496,94 @@
|
|
|
341
496
|
--rt-toggle-color-track-on: var(--rt-color-action-primary);
|
|
342
497
|
--rt-toggle-color-border: var(--rt-color-border-strong);
|
|
343
498
|
--rt-toggle-color-thumb: var(--rt-color-bg-surface);
|
|
344
|
-
--rt-toggle-color-icon: var(--rt-amber-400);
|
|
499
|
+
--rt-toggle-color-icon: var(--rt-amber-400); /* rt-theme-shared: янтарь иконки один в обеих темах */
|
|
345
500
|
--rt-toggle-shadow-thumb: var(--rt-shadow-md);
|
|
346
501
|
/* Рамка off-трека — inset-тенью, а не border: у border своя коробка, и
|
|
347
502
|
отступы бегунка с иконками пришлось бы пересчитывать на её толщину. */
|
|
348
503
|
--rt-toggle-shadow-border: inset 0 0 0 var(--rt-border-width-thin) var(--rt-toggle-color-border);
|
|
349
504
|
/* Навигация (rt-page-header). Шапка — отдельная плашка; отступ от краёв
|
|
350
505
|
страницы задаёт тот, кто её ставит. */
|
|
351
|
-
--rt-nav-header-padding: var(--rt-space-2
|
|
352
|
-
--rt-nav-header-color-bg: var(--rt-neutral-
|
|
506
|
+
--rt-nav-header-padding: var(--rt-space-2) var(--rt-space-4);
|
|
507
|
+
--rt-nav-header-color-bg: var(--rt-neutral-50);
|
|
353
508
|
/* Первый уровень. Пункт ряда несёт плашку цвета самой шапки: на общем фоне её
|
|
354
509
|
не видно, и белым проступает только активный раздел. Наведение красит
|
|
355
510
|
подпись, а не фон — иначе оно спорит с этой подсветкой. */
|
|
356
|
-
--rt-nav-item-height:
|
|
511
|
+
--rt-nav-item-height: var(--rt-size-6);
|
|
357
512
|
--rt-nav-item-gap: var(--rt-space-1);
|
|
358
|
-
--rt-nav-item-padding: var(--rt-space-
|
|
359
|
-
--rt-nav-item-content-gap: var(--rt-space-
|
|
513
|
+
--rt-nav-item-padding: var(--rt-space-2) var(--rt-space-2);
|
|
514
|
+
--rt-nav-item-content-gap: var(--rt-space-2);
|
|
360
515
|
--rt-nav-item-font-size: var(--rt-text-sm);
|
|
361
516
|
--rt-nav-item-font-weight: var(--rt-font-weight-semibold);
|
|
362
517
|
--rt-nav-item-line-height: var(--rt-leading-none);
|
|
363
518
|
--rt-nav-item-color: var(--rt-color-text-primary);
|
|
364
519
|
--rt-nav-item-color-hover: var(--rt-color-action-primary);
|
|
365
520
|
--rt-nav-item-color-pressed: var(--rt-color-action-primary-hover);
|
|
366
|
-
--rt-nav-item-color-bg: var(--rt-neutral-
|
|
367
|
-
--rt-nav-item-color-border: var(--rt-neutral-
|
|
521
|
+
--rt-nav-item-color-bg: var(--rt-neutral-50);
|
|
522
|
+
--rt-nav-item-color-border: var(--rt-neutral-50);
|
|
368
523
|
--rt-nav-item-color-bg-active: var(--rt-color-bg-surface);
|
|
369
|
-
--rt-nav-item-color-caret: var(--rt-neutral-
|
|
524
|
+
--rt-nav-item-color-caret: var(--rt-neutral-200);
|
|
370
525
|
/* Фокус обведён пунктиром: сплошная рамка на плашке пункта неотличима от его
|
|
371
526
|
же границы. */
|
|
372
527
|
--rt-nav-color-focus: var(--rt-color-action-primary);
|
|
373
528
|
/* Недоступный пункт светлее доступного, а не другого оттенка: общий
|
|
374
529
|
`text-disabled` уходит в сине-стальной и рядом с серой подписью читается
|
|
375
530
|
как второй цвет, а не как выключенное состояние. */
|
|
376
|
-
--rt-nav-color-disabled: var(--rt-neutral-
|
|
531
|
+
--rt-nav-color-disabled: var(--rt-neutral-300);
|
|
377
532
|
/* Попап профиля. Подложку берёт у панели навигации, своего здесь — габариты
|
|
378
533
|
блока пользователя, тень и набор строк: строк четыре, и они читаются как
|
|
379
534
|
список действий, а не как выпадающее меню. */
|
|
380
|
-
--rt-profile-menu-min-width:
|
|
535
|
+
--rt-profile-menu-min-width: var(--rt-size-60);
|
|
381
536
|
--rt-profile-menu-padding: var(--rt-space-5);
|
|
382
537
|
--rt-profile-menu-shadow: var(--rt-shadow-profile-menu);
|
|
383
|
-
--rt-profile-avatar-size:
|
|
538
|
+
--rt-profile-avatar-size: var(--rt-size-10);
|
|
384
539
|
--rt-profile-avatar-font-size: var(--rt-text-2xl);
|
|
385
|
-
--rt-profile-item-padding-y: var(--rt-space-
|
|
386
|
-
--rt-profile-item-content-gap: var(--rt-space-2
|
|
540
|
+
--rt-profile-item-padding-y: var(--rt-space-4);
|
|
541
|
+
--rt-profile-item-content-gap: var(--rt-space-2);
|
|
387
542
|
--rt-profile-item-font-size: var(--rt-text-md);
|
|
388
543
|
--rt-profile-item-font-weight: var(--rt-font-weight-medium);
|
|
389
544
|
--rt-profile-item-radius: var(--rt-radius-md);
|
|
390
545
|
/* Строки выступают за содержимое панели на половину её отступа: так
|
|
391
546
|
подсветка на наведении не упирается в рамку, а иконка остаётся на одной
|
|
392
547
|
вертикали с содержимым. Это же число — горизонтальный отступ строки. */
|
|
393
|
-
--rt-profile-row-inset: var(--rt-space-2
|
|
548
|
+
--rt-profile-row-inset: var(--rt-space-2);
|
|
394
549
|
--rt-profile-theme-icon-padding: var(--rt-space-2);
|
|
395
550
|
/* Габариты панели второго уровня: ширина считается числом колонок, поэтому
|
|
396
551
|
колонка, промежуток и внутренний отступ — токены, из которых панель
|
|
397
552
|
складывает свою ширину. По вертикали отступ крупнее: у первой группы над
|
|
398
553
|
заголовком нет ничего, и панель иначе начинается впритык. */
|
|
399
|
-
--rt-nav-panel-column-width:
|
|
554
|
+
--rt-nav-panel-column-width: var(--rt-size-60);
|
|
400
555
|
--rt-nav-panel-column-gap: var(--rt-space-5);
|
|
401
|
-
--rt-nav-panel-padding: var(--rt-space-
|
|
556
|
+
--rt-nav-panel-padding: var(--rt-space-4);
|
|
402
557
|
--rt-nav-panel-padding-y: var(--rt-space-md);
|
|
403
|
-
--rt-nav-panel-group-gap: var(--rt-space-
|
|
558
|
+
--rt-nav-panel-group-gap: var(--rt-space-8);
|
|
404
559
|
--rt-nav-panel-item-gap: var(--rt-space-0-5);
|
|
405
|
-
--rt-nav-panel-item-height:
|
|
560
|
+
--rt-nav-panel-item-height: var(--rt-size-6);
|
|
406
561
|
--rt-nav-panel-item-padding: var(--rt-space-1) var(--rt-space-2);
|
|
407
562
|
--rt-nav-panel-columns: 1;
|
|
408
563
|
--rt-nav-panel-color-bg: var(--rt-color-bg-surface);
|
|
409
|
-
--rt-nav-panel-color-border: var(--rt-neutral-
|
|
564
|
+
--rt-nav-panel-color-border: var(--rt-neutral-200);
|
|
410
565
|
--rt-nav-panel-shadow: var(--rt-shadow-nav-panel);
|
|
411
566
|
/* Второй уровень набран легче первого: ряд разделов держит вес, а полтора
|
|
412
567
|
десятка пунктов под ним читаются построчно. */
|
|
413
568
|
--rt-nav-panel-item-font-size: var(--rt-text-sm);
|
|
414
569
|
--rt-nav-panel-item-font-weight: var(--rt-font-weight-medium);
|
|
415
570
|
--rt-nav-panel-item-content-gap: var(--rt-space-1);
|
|
416
|
-
--rt-nav-panel-item-color: var(--rt-neutral-
|
|
417
|
-
--rt-nav-panel-item-color-bg-hover: var(--rt-neutral-
|
|
571
|
+
--rt-nav-panel-item-color: var(--rt-neutral-600);
|
|
572
|
+
--rt-nav-panel-item-color-bg-hover: var(--rt-neutral-50);
|
|
418
573
|
--rt-nav-panel-item-color-active: var(--rt-color-text-inverse);
|
|
419
574
|
--rt-nav-panel-item-color-bg-active: var(--rt-color-action-primary);
|
|
420
575
|
--rt-nav-panel-group-font-size: var(--rt-text-xs);
|
|
421
576
|
--rt-nav-panel-group-font-weight: var(--rt-font-weight-medium);
|
|
422
|
-
/* Заголовок группы светлее пункта,
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
--rt-nav-panel-group-
|
|
577
|
+
/* Заголовок группы светлее пункта, и оба берут порог контраста на белой панели.
|
|
578
|
+
Отношения обеих пар считает проверка тёмной темы; таблица замера — на странице
|
|
579
|
+
«Colors» витрины. */
|
|
580
|
+
--rt-nav-panel-group-color: var(--rt-neutral-600);
|
|
581
|
+
--rt-nav-panel-group-content-gap: var(--rt-space-2);
|
|
426
582
|
/* Маркер непросмотренного. Точка стоит в потоке следом за подписью — и в ряду
|
|
427
583
|
разделов, и в панели, и на узком экране: место ей даёт общий зазор
|
|
428
584
|
содержимого пункта. */
|
|
429
|
-
--rt-nav-caret-size:
|
|
430
|
-
--rt-nav-marker-size:
|
|
585
|
+
--rt-nav-caret-size: var(--rt-size-3);
|
|
586
|
+
--rt-nav-marker-size: var(--rt-size-1);
|
|
431
587
|
--rt-nav-marker-color: var(--rt-color-state-danger);
|
|
432
588
|
/* Form field (rt-field) — обёртка анатомии поля: label / help / hint / error /
|
|
433
589
|
required-маркер / read-only значение. Визуал label+hint в стиле Tailwind
|
|
@@ -481,13 +637,13 @@ html.rt-theme-dark {
|
|
|
481
637
|
--rt-color-text-muted: var(--rt-overlay-white-40);
|
|
482
638
|
--rt-color-text-disabled: var(--rt-overlay-white-25);
|
|
483
639
|
--rt-color-text-inverse: var(--rt-neutral-900);
|
|
484
|
-
--rt-color-text-link: var(--rt-
|
|
485
|
-
--rt-color-text-link-hover: var(--rt-
|
|
640
|
+
--rt-color-text-link: var(--rt-brand-300);
|
|
641
|
+
--rt-color-text-link-hover: var(--rt-brand-500);
|
|
486
642
|
/* Border — приглушённые на графите */
|
|
487
643
|
--rt-color-border-default: var(--rt-charcoal-border);
|
|
488
644
|
--rt-color-border-strong: var(--rt-charcoal-border-strong);
|
|
489
645
|
--rt-color-border-subtle: var(--rt-charcoal-border);
|
|
490
|
-
--rt-color-border-focus: var(--rt-
|
|
646
|
+
--rt-color-border-focus: var(--rt-brand-500);
|
|
491
647
|
/* Input border видим в dark (в light — transparent). */
|
|
492
648
|
--rt-input-color-border: var(--rt-charcoal-border);
|
|
493
649
|
/* Stepper — в dark рельса уходит от яркого синего к приглушённому серо-синему
|
|
@@ -502,19 +658,39 @@ html.rt-theme-dark {
|
|
|
502
658
|
--rt-nav-item-color-bg: var(--rt-charcoal-950);
|
|
503
659
|
--rt-nav-item-color-border: var(--rt-charcoal-950);
|
|
504
660
|
--rt-nav-item-color-bg-active: var(--rt-charcoal-800);
|
|
505
|
-
--rt-nav-item-color-caret: var(--rt-neutral-
|
|
661
|
+
--rt-nav-item-color-caret: var(--rt-neutral-600);
|
|
506
662
|
--rt-nav-panel-color-bg: var(--rt-charcoal-800);
|
|
507
|
-
--rt-nav-panel-color-border: var(--rt-neutral-
|
|
508
|
-
--rt-nav-panel-item-color: var(--rt-neutral-
|
|
663
|
+
--rt-nav-panel-color-border: var(--rt-neutral-600);
|
|
664
|
+
--rt-nav-panel-item-color: var(--rt-neutral-200);
|
|
509
665
|
--rt-nav-panel-item-color-bg-hover: var(--rt-charcoal-950);
|
|
510
|
-
--rt-nav-panel-group-color: var(--rt-neutral-
|
|
511
|
-
--rt-nav-color-disabled: var(--rt-neutral-
|
|
512
|
-
/* Action —
|
|
513
|
-
|
|
666
|
+
--rt-nav-panel-group-color: var(--rt-neutral-400);
|
|
667
|
+
--rt-nav-color-disabled: var(--rt-neutral-600);
|
|
668
|
+
/* Action — сам цвет марки один в обеих темах, а доля оттенка на графите вдвое
|
|
669
|
+
больше: слабый оттенок на тёмном фоне просто не виден. Считается от ступени
|
|
670
|
+
бренда, как и в светлой теме. */
|
|
671
|
+
--rt-color-action-primary-subtle: color-mix(in srgb, var(--rt-brand-500) 16%, transparent);
|
|
514
672
|
/* Focus-ring в dark — ярче для контрастности на тёмных фонах. */
|
|
515
|
-
--rt-color-action-primary-soft:
|
|
673
|
+
--rt-color-action-primary-soft: color-mix(in srgb, var(--rt-brand-500) 32%, transparent);
|
|
674
|
+
/* Вторичное действие нейтрально, и на графите вся его тройка разворачивается:
|
|
675
|
+
подложка садится на приподнятую поверхность, а наведение и нажатие идут вверх
|
|
676
|
+
по светлоте, а не вниз, — иначе они тонут в фоне страницы. */
|
|
516
677
|
--rt-color-action-secondary: var(--rt-charcoal-700);
|
|
678
|
+
--rt-color-action-secondary-hover: var(--rt-charcoal-border);
|
|
679
|
+
--rt-color-action-secondary-active: var(--rt-charcoal-border-strong);
|
|
517
680
|
--rt-color-action-on-secondary: var(--rt-neutral-50);
|
|
681
|
+
/* Пятый член роли идёт против всей её тройки: подложка садится на поверхность,
|
|
682
|
+
а цвет на поверхности обязан от неё оторваться. Ступень нейтрали, а не графита:
|
|
683
|
+
графит кончается границей, и любая его ступень на карточке даёт меньше двух к
|
|
684
|
+
одному. Светлая тема красит тем же именем, что и подложку, и разъехаться они
|
|
685
|
+
могут только здесь. */
|
|
686
|
+
--rt-color-action-secondary-on-surface: var(--rt-neutral-400);
|
|
687
|
+
/* Отключённое действие на графите — та же приподнятая поверхность; подпись
|
|
688
|
+
наследует ответ тёмной темы по ссылке на приглушённый текст. */
|
|
689
|
+
--rt-color-action-disabled: var(--rt-charcoal-700);
|
|
690
|
+
/* Оттенок наведения на графите вдвое насыщеннее: слабый след на тёмном фоне
|
|
691
|
+
не виден — та же причина, что и у оттенка марки выше. */
|
|
692
|
+
--rt-btn-tint-hover: 16%;
|
|
693
|
+
--rt-btn-tint-active: 32%;
|
|
518
694
|
/* Soft card-shadow в dark — насыщеннее для отделения от фона. */
|
|
519
695
|
--rt-shadow-card-soft: 0 0 40px rgb(0 0 0 / 25%);
|
|
520
696
|
/* Hover-overlay инвертирован для dark (light overlay поверх тёмного фона). */
|
|
@@ -526,22 +702,27 @@ html.rt-theme-dark {
|
|
|
526
702
|
--rt-toggle-color-track: var(--rt-charcoal-950);
|
|
527
703
|
--rt-toggle-color-thumb: var(--rt-neutral-50);
|
|
528
704
|
--rt-toggle-shadow-thumb: var(--rt-shadow-none);
|
|
529
|
-
/* State — surfaces под dark + ярче error-text
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
705
|
+
/* State — surfaces под dark + ярче error-text.
|
|
706
|
+
|
|
707
|
+
Подложка считается от ступени своего статуса, а не повторяет её код цвета
|
|
708
|
+
тройкой каналов: повторённое значение расходится с источником молча, и
|
|
709
|
+
правка ступени оставляла подложку прежней. */
|
|
710
|
+
--rt-color-state-success-bg: color-mix(in srgb, var(--rt-success-500) 12%, transparent);
|
|
711
|
+
--rt-color-state-warning-bg: color-mix(in srgb, var(--rt-warning-500) 12%, transparent);
|
|
712
|
+
--rt-color-state-danger-bg: color-mix(in srgb, var(--rt-danger-500) 12%, transparent);
|
|
533
713
|
--rt-color-state-error-text: var(--rt-danger-500);
|
|
534
|
-
--rt-color-state-
|
|
714
|
+
--rt-color-state-warning-text: var(--rt-warning-500);
|
|
715
|
+
--rt-color-state-info-bg: color-mix(in srgb, var(--rt-info-500) 12%, transparent);
|
|
535
716
|
/* Chat — на графите светлые фоны пузырей нечитаемы: входящее уходит в
|
|
536
717
|
полупрозрачный синий, своё — в глубокий графит. */
|
|
537
|
-
--rt-chat-bubble-in-bg:
|
|
538
|
-
--rt-chat-bubble-in-author: var(--rt-
|
|
718
|
+
--rt-chat-bubble-in-bg: color-mix(in srgb, var(--rt-brand-500) 12%, transparent);
|
|
719
|
+
--rt-chat-bubble-in-author: var(--rt-brand-300);
|
|
539
720
|
--rt-chat-bubble-own-bg: var(--rt-charcoal-950);
|
|
540
721
|
--rt-chat-bubble-own-author: var(--rt-overlay-white-40);
|
|
541
722
|
--rt-chat-bubble-date: var(--rt-overlay-white-40);
|
|
542
|
-
--rt-chat-status-read: var(--rt-
|
|
723
|
+
--rt-chat-status-read: var(--rt-brand-300);
|
|
543
724
|
/* Special — Auth surface (градиентный фон логина + прозрачная карточка). */
|
|
544
|
-
--rt-color-bg-page-auth: linear-gradient(156deg,
|
|
725
|
+
--rt-color-bg-page-auth: linear-gradient(156deg, var(--rt-neutral-950) 12.68%, var(--rt-navy-900) 99.28%);
|
|
545
726
|
--rt-color-bg-surface-auth-card: transparent;
|
|
546
727
|
}
|
|
547
728
|
|
|
@@ -550,286 +731,325 @@ html.rt-theme-dark {
|
|
|
550
731
|
Остальные экраны его не видят — rt-container кроет body непрозрачным фоном
|
|
551
732
|
страницы. Не shorthand `background:`, чтобы не сбросить body{}'ный
|
|
552
733
|
`background-color`. */
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
734
|
+
@layer rt-kit.base {
|
|
735
|
+
:root[data-theme=dark] body,
|
|
736
|
+
html.rt-theme-dark body {
|
|
737
|
+
background-attachment: fixed;
|
|
738
|
+
background-image: linear-gradient(156deg, #122341 12.68%, #182142 99.28%);
|
|
739
|
+
}
|
|
557
740
|
}
|
|
558
|
-
|
|
559
741
|
/* rt-logo (чёрный SVG) — инверсия для читаемости на тёмном фоне */
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
::-webkit-scrollbar {
|
|
566
|
-
width: 12px;
|
|
567
|
-
}
|
|
568
|
-
|
|
569
|
-
::-webkit-scrollbar:horizontal {
|
|
570
|
-
height: 12px;
|
|
571
|
-
}
|
|
572
|
-
|
|
573
|
-
::-webkit-scrollbar-thumb {
|
|
574
|
-
border: var(--rt-border-width-thick) solid transparent;
|
|
575
|
-
border-radius: var(--rt-radius-md);
|
|
576
|
-
background: var(--rt-color-border-default);
|
|
577
|
-
background-clip: content-box;
|
|
578
|
-
}
|
|
579
|
-
|
|
580
|
-
::-webkit-scrollbar-thumb:hover {
|
|
581
|
-
border: var(--rt-border-width-medium) solid transparent;
|
|
582
|
-
background: var(--rt-color-border-strong);
|
|
583
|
-
background-clip: content-box;
|
|
584
|
-
}
|
|
585
|
-
|
|
586
|
-
::-webkit-scrollbar-track:hover {
|
|
587
|
-
border: var(--rt-border-width-thin) solid var(--rt-color-bg-subtle);
|
|
588
|
-
}
|
|
589
|
-
|
|
590
|
-
/* rt-* color namespace bridge — мост на семантические --rt-* токены.
|
|
591
|
-
Живёт здесь, потому что единственный потребитель — `.rt-button` ниже. */
|
|
592
|
-
:root {
|
|
593
|
-
--rt-color-primary: var(--rt-color-action-primary);
|
|
594
|
-
--rt-color-primary-hover: var(--rt-color-action-primary-hover);
|
|
595
|
-
--rt-color-primary-active: var(--rt-color-action-primary-hover);
|
|
596
|
-
--rt-color-on-primary: var(--rt-color-action-on-primary);
|
|
597
|
-
}
|
|
598
|
-
|
|
599
|
-
.rt-button {
|
|
600
|
-
--rt-btn-height: 40px;
|
|
601
|
-
--rt-btn-padding: 0 1.25rem;
|
|
602
|
-
--rt-btn-gap: 0.5rem;
|
|
603
|
-
--rt-btn-radius: 10px;
|
|
604
|
-
--rt-btn-font-size: 0.95rem;
|
|
605
|
-
--rt-btn-icon-size: 1rem;
|
|
606
|
-
--rt-btn-spinner-size: 1rem;
|
|
607
|
-
--rt-btn-spinner-border-width: 2px;
|
|
608
|
-
--rt-btn-bg: var(--rt-color-primary, #10b981);
|
|
609
|
-
--rt-btn-bg-hover: var(--rt-color-primary-hover, #059669);
|
|
610
|
-
--rt-btn-bg-active: var(--rt-color-primary-active, #047857);
|
|
611
|
-
--rt-btn-color: var(--rt-color-on-primary, #fff);
|
|
612
|
-
--rt-btn-border-color: var(--rt-btn-bg);
|
|
613
|
-
--rt-btn-border-color-hover: var(--rt-btn-bg-hover);
|
|
614
|
-
--rt-btn-shadow: none;
|
|
615
|
-
display: inline-flex;
|
|
616
|
-
height: var(--rt-btn-height);
|
|
617
|
-
min-height: var(--rt-btn-height);
|
|
618
|
-
box-sizing: border-box;
|
|
619
|
-
align-items: center;
|
|
620
|
-
justify-content: center;
|
|
621
|
-
padding: var(--rt-btn-padding);
|
|
622
|
-
border: var(--rt-border-width-thin) solid var(--rt-btn-border-color);
|
|
623
|
-
border-radius: var(--rt-btn-radius);
|
|
624
|
-
margin: 0;
|
|
625
|
-
background: var(--rt-btn-bg);
|
|
626
|
-
box-shadow: var(--rt-btn-shadow);
|
|
627
|
-
color: var(--rt-btn-color);
|
|
628
|
-
cursor: pointer;
|
|
629
|
-
font-family: inherit;
|
|
630
|
-
font-size: var(--rt-btn-font-size);
|
|
631
|
-
font-weight: var(--rt-font-weight-medium);
|
|
632
|
-
gap: var(--rt-btn-gap);
|
|
633
|
-
line-height: var(--rt-leading-none);
|
|
634
|
-
outline: none;
|
|
635
|
-
-webkit-tap-highlight-color: transparent;
|
|
636
|
-
text-decoration: none;
|
|
637
|
-
transition: background-color var(--rt-duration-fast), color var(--rt-duration-fast), border-color var(--rt-duration-fast), box-shadow var(--rt-duration-fast);
|
|
638
|
-
user-select: none;
|
|
639
|
-
white-space: nowrap;
|
|
640
|
-
}
|
|
641
|
-
.rt-button:hover:not(:disabled) {
|
|
642
|
-
border-color: var(--rt-btn-border-color-hover);
|
|
643
|
-
background: var(--rt-btn-bg-hover);
|
|
644
|
-
}
|
|
645
|
-
.rt-button:active:not(:disabled) {
|
|
646
|
-
background: var(--rt-btn-bg-active);
|
|
647
|
-
}
|
|
648
|
-
.rt-button:focus-visible {
|
|
649
|
-
box-shadow: var(--rt-shadow-focus-ring);
|
|
650
|
-
outline: 2px solid transparent;
|
|
651
|
-
outline-offset: 2px;
|
|
652
|
-
}
|
|
653
|
-
.rt-button:disabled {
|
|
654
|
-
--rt-btn-bg: var(--rt-color-disabled, #d1d5db);
|
|
655
|
-
--rt-btn-bg-hover: var(--rt-color-disabled, #d1d5db);
|
|
656
|
-
--rt-btn-border-color: var(--rt-color-disabled, #d1d5db);
|
|
657
|
-
--rt-btn-border-color-hover: var(--rt-color-disabled, #d1d5db);
|
|
658
|
-
--rt-btn-color: var(--rt-color-on-disabled, #6b7280);
|
|
659
|
-
cursor: not-allowed;
|
|
660
|
-
}
|
|
661
|
-
.rt-button {
|
|
662
|
-
/* `flex-shrink: 0` — иконке заданного размера. Без него в кнопке, которой ширину
|
|
663
|
-
навязали снаружи (пункт меню `rt-split-button` берёт её от панели), лейбл давит
|
|
664
|
-
на иконку, и та сжимается до нуля: место занято, а иконки не видно. */
|
|
665
|
-
}
|
|
666
|
-
.rt-button__icon {
|
|
667
|
-
display: inline-flex;
|
|
668
|
-
width: var(--rt-btn-icon-size);
|
|
669
|
-
height: var(--rt-btn-icon-size);
|
|
670
|
-
flex-shrink: 0;
|
|
671
|
-
align-items: center;
|
|
672
|
-
justify-content: center;
|
|
673
|
-
font-size: var(--rt-btn-icon-size);
|
|
674
|
-
}
|
|
675
|
-
.rt-button__label {
|
|
676
|
-
display: inline-flex;
|
|
677
|
-
align-items: center;
|
|
678
|
-
white-space: nowrap;
|
|
679
|
-
}
|
|
680
|
-
.rt-button__spinner {
|
|
681
|
-
--rt-btn-spinner-fade-duration: 0.3s;
|
|
682
|
-
--rt-btn-spinner-rotation-duration: 0.7s;
|
|
683
|
-
display: inline-flex;
|
|
684
|
-
align-items: center;
|
|
685
|
-
justify-content: center;
|
|
686
|
-
animation: rt-button-fade-in var(--rt-btn-spinner-fade-duration) both;
|
|
687
|
-
}
|
|
688
|
-
.rt-button__spinner-circle {
|
|
689
|
-
display: inline-block;
|
|
690
|
-
width: var(--rt-btn-spinner-size);
|
|
691
|
-
height: var(--rt-btn-spinner-size);
|
|
692
|
-
border: var(--rt-btn-spinner-border-width) solid currentcolor;
|
|
693
|
-
border-radius: var(--rt-radius-full);
|
|
694
|
-
border-bottom-color: transparent;
|
|
695
|
-
animation: rt-button-spin var(--rt-btn-spinner-rotation-duration) linear infinite;
|
|
696
|
-
opacity: 0.85;
|
|
697
|
-
}
|
|
698
|
-
.rt-button--secondary {
|
|
699
|
-
--rt-btn-bg: var(--rt-color-secondary, #6b7280);
|
|
700
|
-
--rt-btn-bg-hover: var(--rt-color-secondary-hover, #4b5563);
|
|
701
|
-
--rt-btn-bg-active: var(--rt-color-secondary-active, #374151);
|
|
702
|
-
}
|
|
703
|
-
.rt-button--success {
|
|
704
|
-
--rt-btn-bg: var(--rt-color-success, #16a34a);
|
|
705
|
-
--rt-btn-bg-hover: var(--rt-color-success-hover, #15803d);
|
|
706
|
-
--rt-btn-bg-active: var(--rt-color-success-active, #166534);
|
|
707
|
-
}
|
|
708
|
-
.rt-button--warning {
|
|
709
|
-
--rt-btn-bg: var(--rt-color-warning, #f59e0b);
|
|
710
|
-
--rt-btn-bg-hover: var(--rt-color-warning-hover, #d97706);
|
|
711
|
-
--rt-btn-bg-active: var(--rt-color-warning-active, #b45309);
|
|
712
|
-
}
|
|
713
|
-
.rt-button--danger {
|
|
714
|
-
--rt-btn-bg: var(--rt-color-danger, #ef4444);
|
|
715
|
-
--rt-btn-bg-hover: var(--rt-color-danger-hover, #dc2626);
|
|
716
|
-
--rt-btn-bg-active: var(--rt-color-danger-active, #b91c1c);
|
|
717
|
-
}
|
|
718
|
-
.rt-button--info {
|
|
719
|
-
--rt-btn-bg: var(--rt-color-info, #0ea5e9);
|
|
720
|
-
--rt-btn-bg-hover: var(--rt-color-info-hover, #0284c7);
|
|
721
|
-
--rt-btn-bg-active: var(--rt-color-info-active, #0369a1);
|
|
722
|
-
}
|
|
723
|
-
.rt-button--outlined {
|
|
724
|
-
--rt-btn-bg: transparent;
|
|
725
|
-
--rt-btn-bg-hover: rgb(16 185 129 / 8%);
|
|
726
|
-
--rt-btn-bg-active: rgb(16 185 129 / 16%);
|
|
727
|
-
--rt-btn-color: var(--rt-color-primary, #10b981);
|
|
728
|
-
--rt-btn-border-color: currentcolor;
|
|
729
|
-
--rt-btn-border-color-hover: currentcolor;
|
|
730
|
-
--rt-btn-shadow: none;
|
|
731
|
-
}
|
|
732
|
-
.rt-button--outlined.rt-button--secondary {
|
|
733
|
-
--rt-btn-color: var(--rt-color-secondary, #6b7280);
|
|
734
|
-
}
|
|
735
|
-
.rt-button--outlined.rt-button--success {
|
|
736
|
-
--rt-btn-color: var(--rt-color-success, #16a34a);
|
|
737
|
-
}
|
|
738
|
-
.rt-button--outlined.rt-button--warning {
|
|
739
|
-
--rt-btn-color: var(--rt-color-warning, #f59e0b);
|
|
740
|
-
}
|
|
741
|
-
.rt-button--outlined.rt-button--danger {
|
|
742
|
-
--rt-btn-color: var(--rt-color-danger, #ef4444);
|
|
743
|
-
}
|
|
744
|
-
.rt-button--outlined.rt-button--info {
|
|
745
|
-
--rt-btn-color: var(--rt-color-info, #0ea5e9);
|
|
746
|
-
}
|
|
747
|
-
.rt-button--text {
|
|
748
|
-
--rt-btn-bg: transparent;
|
|
749
|
-
--rt-btn-bg-hover: rgb(16 185 129 / 8%);
|
|
750
|
-
--rt-btn-bg-active: rgb(16 185 129 / 16%);
|
|
751
|
-
--rt-btn-color: var(--rt-color-primary, #10b981);
|
|
752
|
-
--rt-btn-border-color: transparent;
|
|
753
|
-
--rt-btn-border-color-hover: transparent;
|
|
754
|
-
--rt-btn-shadow: none;
|
|
755
|
-
}
|
|
756
|
-
.rt-button--text.rt-button--secondary {
|
|
757
|
-
--rt-btn-color: var(--rt-color-secondary, #6b7280);
|
|
758
|
-
}
|
|
759
|
-
.rt-button--text.rt-button--success {
|
|
760
|
-
--rt-btn-color: var(--rt-color-success, #16a34a);
|
|
761
|
-
}
|
|
762
|
-
.rt-button--text.rt-button--warning {
|
|
763
|
-
--rt-btn-color: var(--rt-color-warning, #f59e0b);
|
|
764
|
-
}
|
|
765
|
-
.rt-button--text.rt-button--danger {
|
|
766
|
-
--rt-btn-color: var(--rt-color-danger, #ef4444);
|
|
767
|
-
}
|
|
768
|
-
.rt-button--text.rt-button--info {
|
|
769
|
-
--rt-btn-color: var(--rt-color-info, #0ea5e9);
|
|
770
|
-
}
|
|
771
|
-
.rt-button--rounded {
|
|
772
|
-
--rt-btn-radius: 999px;
|
|
773
|
-
}
|
|
774
|
-
.rt-button--sm {
|
|
775
|
-
--rt-btn-height: 30px;
|
|
776
|
-
--rt-btn-padding: 0 0.875rem;
|
|
777
|
-
--rt-btn-font-size: 0.8125rem;
|
|
778
|
-
--rt-btn-icon-size: 0.875rem;
|
|
779
|
-
--rt-btn-spinner-size: 0.875rem;
|
|
780
|
-
}
|
|
781
|
-
.rt-button--lg {
|
|
782
|
-
--rt-btn-height: 50px;
|
|
783
|
-
--rt-btn-padding: 0 1.5rem;
|
|
784
|
-
--rt-btn-font-size: 1.0625rem;
|
|
785
|
-
--rt-btn-icon-size: 1.125rem;
|
|
786
|
-
--rt-btn-spinner-size: 1.125rem;
|
|
787
|
-
}
|
|
788
|
-
.rt-button--xl {
|
|
789
|
-
--rt-btn-height: 60px;
|
|
790
|
-
--rt-btn-padding: 0 1.75rem;
|
|
791
|
-
--rt-btn-font-size: 1.125rem;
|
|
792
|
-
--rt-btn-icon-size: 1.25rem;
|
|
793
|
-
--rt-btn-spinner-size: 1.25rem;
|
|
794
|
-
}
|
|
795
|
-
.rt-button--2xl {
|
|
796
|
-
--rt-btn-height: 70px;
|
|
797
|
-
--rt-btn-padding: 0 2rem;
|
|
798
|
-
--rt-btn-font-size: 1.1875rem;
|
|
799
|
-
--rt-btn-icon-size: 1.375rem;
|
|
800
|
-
--rt-btn-spinner-size: 1.375rem;
|
|
801
|
-
}
|
|
802
|
-
.rt-button--icon-only {
|
|
803
|
-
width: var(--rt-btn-height);
|
|
804
|
-
padding: 0;
|
|
805
|
-
gap: 0;
|
|
806
|
-
}
|
|
807
|
-
.rt-button--icon-only.rt-button--rounded {
|
|
808
|
-
--rt-btn-radius: 50%;
|
|
742
|
+
@layer rt-kit.base {
|
|
743
|
+
:root[data-theme=dark] .rt-logo,
|
|
744
|
+
html.rt-theme-dark .rt-logo {
|
|
745
|
+
filter: invert(1) brightness(1.5);
|
|
746
|
+
}
|
|
809
747
|
}
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
748
|
+
@layer rt-kit.base {
|
|
749
|
+
::-webkit-scrollbar {
|
|
750
|
+
width: 12px;
|
|
751
|
+
}
|
|
752
|
+
::-webkit-scrollbar:horizontal {
|
|
753
|
+
height: 12px;
|
|
754
|
+
}
|
|
755
|
+
::-webkit-scrollbar-thumb {
|
|
756
|
+
border: var(--rt-border-width-thick) solid transparent;
|
|
757
|
+
border-radius: var(--rt-radius-md);
|
|
758
|
+
background: var(--rt-color-border-default);
|
|
759
|
+
background-clip: content-box;
|
|
760
|
+
}
|
|
761
|
+
::-webkit-scrollbar-thumb:hover {
|
|
762
|
+
border: var(--rt-border-width-medium) solid transparent;
|
|
763
|
+
background: var(--rt-color-border-strong);
|
|
764
|
+
background-clip: content-box;
|
|
765
|
+
}
|
|
766
|
+
::-webkit-scrollbar-track:hover {
|
|
767
|
+
border: var(--rt-border-width-thin) solid var(--rt-color-bg-subtle);
|
|
768
|
+
}
|
|
813
769
|
}
|
|
770
|
+
@layer rt-kit.components {
|
|
771
|
+
.rt-button {
|
|
772
|
+
/* Высота приходит общей шкалой контролов, а не своим числом: кнопка, поле и
|
|
773
|
+
иконочная кнопка одного размера стоят в одной строке и обязаны совпадать. */
|
|
774
|
+
--rt-btn-height: var(--rt-control-height-md);
|
|
775
|
+
--rt-btn-padding: 0 1.25rem;
|
|
776
|
+
--rt-btn-gap: 0.5rem;
|
|
777
|
+
--rt-btn-radius: var(--rt-radius-lg);
|
|
778
|
+
--rt-btn-border-width: var(--rt-border-width-thin);
|
|
779
|
+
--rt-btn-transition-duration: var(--rt-duration-fast);
|
|
780
|
+
--rt-btn-focus-shadow: var(--rt-shadow-focus-ring);
|
|
781
|
+
--rt-btn-font-size: 0.95rem;
|
|
782
|
+
--rt-btn-icon-size: 1rem;
|
|
783
|
+
--rt-btn-spinner-size: 1rem;
|
|
784
|
+
--rt-btn-spinner-border-width: var(--rt-border-width-medium);
|
|
785
|
+
--rt-btn-spinner-radius: var(--rt-radius-full);
|
|
786
|
+
--rt-btn-bg: var(--rt-color-action-primary);
|
|
787
|
+
--rt-btn-bg-hover: var(--rt-color-action-primary-hover);
|
|
788
|
+
--rt-btn-bg-active: var(--rt-color-action-primary-active);
|
|
789
|
+
--rt-btn-color: var(--rt-color-action-on-primary);
|
|
790
|
+
--rt-btn-border-color: var(--rt-btn-bg);
|
|
791
|
+
--rt-btn-border-color-hover: var(--rt-btn-bg-hover);
|
|
792
|
+
--rt-btn-shadow: none;
|
|
793
|
+
display: inline-flex;
|
|
794
|
+
height: var(--rt-btn-height);
|
|
795
|
+
min-height: var(--rt-btn-height);
|
|
796
|
+
box-sizing: border-box;
|
|
797
|
+
align-items: center;
|
|
798
|
+
justify-content: center;
|
|
799
|
+
padding: var(--rt-btn-padding);
|
|
800
|
+
border: var(--rt-btn-border-width) solid var(--rt-btn-border-color);
|
|
801
|
+
border-radius: var(--rt-btn-radius);
|
|
802
|
+
margin: 0;
|
|
803
|
+
background: var(--rt-btn-bg);
|
|
804
|
+
box-shadow: var(--rt-btn-shadow);
|
|
805
|
+
color: var(--rt-btn-color);
|
|
806
|
+
cursor: pointer;
|
|
807
|
+
font-family: inherit;
|
|
808
|
+
font-size: var(--rt-btn-font-size);
|
|
809
|
+
font-weight: var(--rt-font-weight-medium);
|
|
810
|
+
gap: var(--rt-btn-gap);
|
|
811
|
+
line-height: var(--rt-leading-none);
|
|
812
|
+
outline: none;
|
|
813
|
+
-webkit-tap-highlight-color: transparent;
|
|
814
|
+
text-decoration: none;
|
|
815
|
+
transition: background-color var(--rt-btn-transition-duration), color var(--rt-btn-transition-duration), border-color var(--rt-btn-transition-duration), box-shadow var(--rt-btn-transition-duration);
|
|
816
|
+
user-select: none;
|
|
817
|
+
white-space: nowrap;
|
|
818
|
+
}
|
|
819
|
+
.rt-button:hover:not(:disabled) {
|
|
820
|
+
border-color: var(--rt-btn-border-color-hover);
|
|
821
|
+
background: var(--rt-btn-bg-hover);
|
|
822
|
+
}
|
|
823
|
+
.rt-button:active:not(:disabled) {
|
|
824
|
+
background: var(--rt-btn-bg-active);
|
|
825
|
+
}
|
|
826
|
+
.rt-button:focus-visible {
|
|
827
|
+
box-shadow: var(--rt-btn-focus-shadow);
|
|
828
|
+
outline: 2px solid transparent;
|
|
829
|
+
outline-offset: 2px;
|
|
830
|
+
}
|
|
831
|
+
.rt-button {
|
|
832
|
+
/* `flex-shrink: 0` — иконке заданного размера. Без него в кнопке, которой ширину
|
|
833
|
+
навязали снаружи (пункт меню `rt-split-button` берёт её от панели), лейбл давит
|
|
834
|
+
на иконку, и та сжимается до нуля: место занято, а иконки не видно. */
|
|
835
|
+
}
|
|
836
|
+
.rt-button__icon {
|
|
837
|
+
display: inline-flex;
|
|
838
|
+
width: var(--rt-btn-icon-size);
|
|
839
|
+
height: var(--rt-btn-icon-size);
|
|
840
|
+
flex-shrink: 0;
|
|
841
|
+
align-items: center;
|
|
842
|
+
justify-content: center;
|
|
843
|
+
font-size: var(--rt-btn-icon-size);
|
|
844
|
+
}
|
|
845
|
+
.rt-button__label {
|
|
846
|
+
display: inline-flex;
|
|
847
|
+
align-items: center;
|
|
848
|
+
white-space: nowrap;
|
|
849
|
+
}
|
|
850
|
+
.rt-button__spinner {
|
|
851
|
+
--rt-btn-spinner-fade-duration: 0.3s;
|
|
852
|
+
--rt-btn-spinner-rotation-duration: 0.7s;
|
|
853
|
+
display: inline-flex;
|
|
854
|
+
align-items: center;
|
|
855
|
+
justify-content: center;
|
|
856
|
+
animation: rt-button-fade-in var(--rt-btn-spinner-fade-duration) both;
|
|
857
|
+
}
|
|
858
|
+
.rt-button__spinner-circle {
|
|
859
|
+
display: inline-block;
|
|
860
|
+
width: var(--rt-btn-spinner-size);
|
|
861
|
+
height: var(--rt-btn-spinner-size);
|
|
862
|
+
border: var(--rt-btn-spinner-border-width) solid currentcolor;
|
|
863
|
+
border-radius: var(--rt-btn-spinner-radius);
|
|
864
|
+
border-bottom-color: transparent;
|
|
865
|
+
animation: rt-button-spin var(--rt-btn-spinner-rotation-duration) linear infinite;
|
|
866
|
+
opacity: 0.85;
|
|
867
|
+
}
|
|
868
|
+
.rt-button--secondary {
|
|
869
|
+
--rt-btn-bg: var(--rt-color-action-secondary);
|
|
870
|
+
--rt-btn-bg-hover: var(--rt-color-action-secondary-hover);
|
|
871
|
+
--rt-btn-bg-active: var(--rt-color-action-secondary-active);
|
|
872
|
+
--rt-btn-color: var(--rt-color-action-on-secondary);
|
|
873
|
+
}
|
|
874
|
+
.rt-button--success {
|
|
875
|
+
--rt-btn-bg: var(--rt-color-action-success);
|
|
876
|
+
--rt-btn-bg-hover: var(--rt-color-action-success-hover);
|
|
877
|
+
--rt-btn-bg-active: var(--rt-color-action-success-active);
|
|
878
|
+
--rt-btn-color: var(--rt-color-action-on-success);
|
|
879
|
+
}
|
|
880
|
+
.rt-button--warning {
|
|
881
|
+
--rt-btn-bg: var(--rt-color-action-warning);
|
|
882
|
+
--rt-btn-bg-hover: var(--rt-color-action-warning-hover);
|
|
883
|
+
--rt-btn-bg-active: var(--rt-color-action-warning-active);
|
|
884
|
+
--rt-btn-color: var(--rt-color-action-on-warning);
|
|
885
|
+
}
|
|
886
|
+
.rt-button--danger {
|
|
887
|
+
--rt-btn-bg: var(--rt-color-action-danger);
|
|
888
|
+
--rt-btn-bg-hover: var(--rt-color-action-danger-hover);
|
|
889
|
+
--rt-btn-bg-active: var(--rt-color-action-danger-active);
|
|
890
|
+
--rt-btn-color: var(--rt-color-action-on-danger);
|
|
891
|
+
}
|
|
892
|
+
.rt-button--info {
|
|
893
|
+
--rt-btn-bg: var(--rt-color-action-info);
|
|
894
|
+
--rt-btn-bg-hover: var(--rt-color-action-info-hover);
|
|
895
|
+
--rt-btn-bg-active: var(--rt-color-action-info-active);
|
|
896
|
+
--rt-btn-color: var(--rt-color-action-on-info);
|
|
897
|
+
}
|
|
898
|
+
.rt-button {
|
|
899
|
+
/* Подложка наведения и нажатия у безфоновых оформлений считается от цвета самой
|
|
900
|
+
кнопки, а не берётся готовым оттенком: оттенок в слое назначений есть только у
|
|
901
|
+
марки, и роли danger или success получали бы от него чужой след. Доли вынесены
|
|
902
|
+
свойствами — на графите слабый оттенок не виден, и тёмная тема их поднимает. */
|
|
903
|
+
}
|
|
904
|
+
.rt-button--outlined {
|
|
905
|
+
--rt-btn-bg: transparent;
|
|
906
|
+
--rt-btn-bg-hover: color-mix(in srgb, var(--rt-btn-color) var(--rt-btn-tint-hover), transparent);
|
|
907
|
+
--rt-btn-bg-active: color-mix(in srgb, var(--rt-btn-color) var(--rt-btn-tint-active), transparent);
|
|
908
|
+
--rt-btn-color: var(--rt-color-action-primary-on-surface);
|
|
909
|
+
--rt-btn-border-color: currentcolor;
|
|
910
|
+
--rt-btn-border-color-hover: currentcolor;
|
|
911
|
+
--rt-btn-shadow: none;
|
|
912
|
+
}
|
|
913
|
+
.rt-button--outlined.rt-button--secondary {
|
|
914
|
+
--rt-btn-color: var(--rt-color-action-secondary-on-surface);
|
|
915
|
+
}
|
|
916
|
+
.rt-button--outlined.rt-button--success {
|
|
917
|
+
--rt-btn-color: var(--rt-color-action-success-on-surface);
|
|
918
|
+
}
|
|
919
|
+
.rt-button--outlined.rt-button--warning {
|
|
920
|
+
--rt-btn-color: var(--rt-color-action-warning-on-surface);
|
|
921
|
+
}
|
|
922
|
+
.rt-button--outlined.rt-button--danger {
|
|
923
|
+
--rt-btn-color: var(--rt-color-action-danger-on-surface);
|
|
924
|
+
}
|
|
925
|
+
.rt-button--outlined.rt-button--info {
|
|
926
|
+
--rt-btn-color: var(--rt-color-action-info-on-surface);
|
|
927
|
+
}
|
|
928
|
+
.rt-button--text {
|
|
929
|
+
--rt-btn-bg: transparent;
|
|
930
|
+
--rt-btn-bg-hover: color-mix(in srgb, var(--rt-btn-color) var(--rt-btn-tint-hover), transparent);
|
|
931
|
+
--rt-btn-bg-active: color-mix(in srgb, var(--rt-btn-color) var(--rt-btn-tint-active), transparent);
|
|
932
|
+
--rt-btn-color: var(--rt-color-action-primary-on-surface);
|
|
933
|
+
--rt-btn-border-color: transparent;
|
|
934
|
+
--rt-btn-border-color-hover: transparent;
|
|
935
|
+
--rt-btn-shadow: none;
|
|
936
|
+
}
|
|
937
|
+
.rt-button--text.rt-button--secondary {
|
|
938
|
+
--rt-btn-color: var(--rt-color-action-secondary-on-surface);
|
|
939
|
+
}
|
|
940
|
+
.rt-button--text.rt-button--success {
|
|
941
|
+
--rt-btn-color: var(--rt-color-action-success-on-surface);
|
|
942
|
+
}
|
|
943
|
+
.rt-button--text.rt-button--warning {
|
|
944
|
+
--rt-btn-color: var(--rt-color-action-warning-on-surface);
|
|
945
|
+
}
|
|
946
|
+
.rt-button--text.rt-button--danger {
|
|
947
|
+
--rt-btn-color: var(--rt-color-action-danger-on-surface);
|
|
948
|
+
}
|
|
949
|
+
.rt-button--text.rt-button--info {
|
|
950
|
+
--rt-btn-color: var(--rt-color-action-info-on-surface);
|
|
951
|
+
}
|
|
952
|
+
.rt-button--rounded {
|
|
953
|
+
--rt-btn-radius: 999px;
|
|
954
|
+
}
|
|
955
|
+
.rt-button--sm {
|
|
956
|
+
--rt-btn-height: var(--rt-control-height-sm);
|
|
957
|
+
--rt-btn-padding: 0 0.875rem;
|
|
958
|
+
--rt-btn-font-size: 0.8125rem;
|
|
959
|
+
--rt-btn-icon-size: 0.875rem;
|
|
960
|
+
--rt-btn-spinner-size: 0.875rem;
|
|
961
|
+
}
|
|
962
|
+
.rt-button--lg {
|
|
963
|
+
--rt-btn-height: var(--rt-control-height-lg);
|
|
964
|
+
--rt-btn-padding: 0 1.5rem;
|
|
965
|
+
--rt-btn-font-size: 1.0625rem;
|
|
966
|
+
--rt-btn-icon-size: 1.125rem;
|
|
967
|
+
--rt-btn-spinner-size: 1.125rem;
|
|
968
|
+
}
|
|
969
|
+
.rt-button--xl {
|
|
970
|
+
--rt-btn-height: var(--rt-control-height-xl);
|
|
971
|
+
--rt-btn-padding: 0 1.75rem;
|
|
972
|
+
--rt-btn-font-size: 1.125rem;
|
|
973
|
+
--rt-btn-icon-size: 1.25rem;
|
|
974
|
+
--rt-btn-spinner-size: 1.25rem;
|
|
975
|
+
}
|
|
976
|
+
.rt-button--2xl {
|
|
977
|
+
--rt-btn-height: var(--rt-control-height-2xl);
|
|
978
|
+
--rt-btn-padding: 0 2rem;
|
|
979
|
+
--rt-btn-font-size: 1.1875rem;
|
|
980
|
+
--rt-btn-icon-size: 1.375rem;
|
|
981
|
+
--rt-btn-spinner-size: 1.375rem;
|
|
982
|
+
}
|
|
983
|
+
.rt-button--icon-only {
|
|
984
|
+
width: var(--rt-btn-height);
|
|
985
|
+
padding: 0;
|
|
986
|
+
gap: 0;
|
|
987
|
+
}
|
|
988
|
+
.rt-button--icon-only.rt-button--rounded {
|
|
989
|
+
--rt-btn-radius: 50%;
|
|
990
|
+
}
|
|
991
|
+
.rt-button--loading {
|
|
992
|
+
cursor: wait;
|
|
993
|
+
pointer-events: none;
|
|
994
|
+
}
|
|
995
|
+
.rt-button {
|
|
996
|
+
/* Состояние стоит ниже всех вариантов оформления и палитры того же блока.
|
|
997
|
+
Специфичность у них равная, и правила равной силы разбираются порядком в
|
|
998
|
+
файле: отсюда, снизу, отключённость отменяет и заливку, и цвет подписи.
|
|
999
|
+
Стояла она выше — и проигрывала молча: текстовая кнопка получала серую
|
|
1000
|
+
плашку, которой у неё нет ни в одном другом состоянии, а отключённая
|
|
1001
|
+
danger оставалась красной надписью на этой плашке.
|
|
814
1002
|
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
transform: rotate(360deg);
|
|
1003
|
+
Поднимать специфичность вместо переноса нельзя: она перебила бы и то, чего
|
|
1004
|
+
перебивать не собирались, — размер, скругление и свои свойства потребителя. */
|
|
818
1005
|
}
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
1006
|
+
.rt-button:disabled {
|
|
1007
|
+
--rt-btn-bg: var(--rt-color-action-disabled);
|
|
1008
|
+
--rt-btn-bg-hover: var(--rt-color-action-disabled);
|
|
1009
|
+
--rt-btn-bg-active: var(--rt-color-action-disabled);
|
|
1010
|
+
--rt-btn-border-color: var(--rt-color-action-disabled);
|
|
1011
|
+
--rt-btn-border-color-hover: var(--rt-color-action-disabled);
|
|
1012
|
+
--rt-btn-color: var(--rt-color-action-on-disabled);
|
|
1013
|
+
cursor: not-allowed;
|
|
823
1014
|
}
|
|
824
|
-
|
|
825
|
-
|
|
1015
|
+
.rt-button {
|
|
1016
|
+
/* Безфоновым оформлениям отключённость фона не даёт: его у них нет ни в одном
|
|
1017
|
+
другом состоянии, и серая плашка читалась бы как подсветка, а не как
|
|
1018
|
+
недоступность. Остаётся приглушённая подпись, а обводочной — спокойная рамка
|
|
1019
|
+
вместо цвета своей роли. */
|
|
826
1020
|
}
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
1021
|
+
.rt-button--outlined:disabled, .rt-button--text:disabled {
|
|
1022
|
+
--rt-btn-bg: transparent;
|
|
1023
|
+
--rt-btn-bg-hover: transparent;
|
|
1024
|
+
--rt-btn-bg-active: transparent;
|
|
1025
|
+
}
|
|
1026
|
+
.rt-button--outlined:disabled {
|
|
1027
|
+
--rt-btn-border-color: var(--rt-color-border-default);
|
|
1028
|
+
--rt-btn-border-color-hover: var(--rt-color-border-default);
|
|
1029
|
+
}
|
|
1030
|
+
.rt-button--text:disabled {
|
|
1031
|
+
--rt-btn-border-color: transparent;
|
|
1032
|
+
--rt-btn-border-color-hover: transparent;
|
|
1033
|
+
}
|
|
1034
|
+
@keyframes rt-button-spin {
|
|
1035
|
+
to {
|
|
1036
|
+
transform: rotate(360deg);
|
|
1037
|
+
}
|
|
1038
|
+
}
|
|
1039
|
+
@keyframes rt-button-fade-in {
|
|
1040
|
+
from {
|
|
1041
|
+
opacity: 0;
|
|
1042
|
+
}
|
|
1043
|
+
to {
|
|
1044
|
+
opacity: 1;
|
|
1045
|
+
}
|
|
831
1046
|
}
|
|
832
|
-
|
|
833
|
-
|
|
1047
|
+
@keyframes rt-button-fade-out {
|
|
1048
|
+
from {
|
|
1049
|
+
opacity: 1;
|
|
1050
|
+
}
|
|
1051
|
+
to {
|
|
1052
|
+
opacity: 0;
|
|
1053
|
+
}
|
|
834
1054
|
}
|
|
835
1055
|
}
|