@rt-tools/ui-kit-v2 0.6.0 → 0.8.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 +16 -7
- package/fesm2022/rt-tools-ui-kit-v2.mjs +2494 -1374
- package/fesm2022/rt-tools-ui-kit-v2.mjs.map +1 -1
- package/package.json +1 -1
- package/rt-tools-ui-kit-v2-0.8.0.tgz +0 -0
- package/src/lib/components/chat/CONTEXT.md +5 -0
- package/src/lib/components/chat/rt-chat.component.scss +12 -1
- package/src/lib/components/form-control/CONTEXT.md +7 -0
- package/src/lib/components/icon/CONTEXT.md +16 -10
- package/src/lib/components/input/CONTEXT.md +9 -7
- package/src/lib/components/markdown-text/CONTEXT.md +40 -0
- package/src/lib/components/markdown-text/rt-markdown-text.component.scss +130 -0
- package/src/lib/components/message-composer/CONTEXT.md +1 -1
- package/src/lib/components/rich-editor/CONTEXT.md +1 -1
- package/src/lib/components/table/copy-cell/rt-copy-cell.component.scss +5 -0
- package/src/lib/components/toolbar/rt-toolbar.component.scss +7 -0
- package/src/lib/components/tooltip/rt-tooltip.component.scss +4 -0
- package/src/styles/_index.scss +7 -0
- package/src/styles/_primitives.scss +38 -25
- package/src/styles/_semantic.scss +16 -7
- package/src/styles/_theme-dark-rules.scss +23 -0
- package/src/styles/_theme-dark.scss +12 -26
- package/styles/tokens.css +151 -35
- package/types/rt-tools-ui-kit-v2.d.ts +477 -208
- package/rt-tools-ui-kit-v2-0.6.0.tgz +0 -0
package/styles/tokens.css
CHANGED
|
@@ -21,32 +21,41 @@
|
|
|
21
21
|
Кит его за потребителя не подключает: редактор текста опционален, и тянуть его тему в
|
|
22
22
|
пакет значило бы отдать её всем. */
|
|
23
23
|
@layer rt-kit.vendor, rt-kit.base, rt-kit.components;
|
|
24
|
-
/*
|
|
24
|
+
/* Собрано генератором `tools/build-tokens-v2.mjs` из `tokens.source.mjs` — правится там, не здесь:
|
|
25
|
+
правка на месте теряется на следующей сборке, и её называет `pnpm run check:tokens-build`. */
|
|
26
|
+
/* Ступени шкал — значения, из которых слой назначений выбирает. Единственное место кита, где
|
|
27
|
+
код цвета и размер числом законны по определению. */
|
|
25
28
|
:root {
|
|
26
|
-
/* Neutral scale —
|
|
29
|
+
/* Neutral scale — серая, без цветности.
|
|
27
30
|
|
|
28
|
-
Ряд посчитан в OKLCH:
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
sRGB: синеватого такой светлоты не существует.
|
|
31
|
+
Ряд посчитан в OKLCH: цветность нулевая у всех ступеней, светлота идёт ровным
|
|
32
|
+
шагом 0.0785 от 0.985 к 0.20. Ноль остаётся чистым белым — это бумага, а не
|
|
33
|
+
ступень ряда.
|
|
32
34
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
35
|
+
Цветность снята потому, что ею красились три роли сразу: фон поля ввода,
|
|
36
|
+
приглушённая поверхность и подсветка наведения. Все три разворачивались в одну
|
|
37
|
+
ступень 100, а на тоне 264° с цветностью 0.0234 она давала #d8e0f0 — сине-серый
|
|
38
|
+
блок на почти белой странице, в котором тонула и собственная рамка поля. Синева
|
|
39
|
+
была следствием того, что тон и цветность ряда взяли у ступени 600: у тёмного
|
|
40
|
+
конца они незаметны, у светлого — нет.
|
|
41
|
+
|
|
42
|
+
Ряд остаётся ровным, и две опорные ступени сходятся с прежним выпуском кита:
|
|
43
|
+
50 и 500. Светлый конец с ним не сходится и сойтись не может: там три ступени
|
|
44
|
+
подряд лежат в полосе светлоты шириной 0.06, а ровный ряд из одиннадцати
|
|
45
|
+
ступеней, доходящий до почти чёрного, столько туда не вмещает. Полосу закрывает
|
|
46
|
+
назначение прозрачным оттенком, а не правка шага. */
|
|
38
47
|
--rt-neutral-0: #fff;
|
|
39
|
-
--rt-neutral-50: #
|
|
40
|
-
--rt-neutral-100: #
|
|
41
|
-
--rt-neutral-200: #
|
|
42
|
-
--rt-neutral-300: #
|
|
43
|
-
--rt-neutral-400: #
|
|
44
|
-
--rt-neutral-500: #
|
|
45
|
-
--rt-neutral-600: #
|
|
46
|
-
--rt-neutral-700: #
|
|
47
|
-
--rt-neutral-800: #
|
|
48
|
-
--rt-neutral-900: #
|
|
49
|
-
--rt-neutral-950: #
|
|
48
|
+
--rt-neutral-50: #fafafa;
|
|
49
|
+
--rt-neutral-100: #e0e0e0;
|
|
50
|
+
--rt-neutral-200: #c6c6c6;
|
|
51
|
+
--rt-neutral-300: #aeaeae;
|
|
52
|
+
--rt-neutral-400: #959595;
|
|
53
|
+
--rt-neutral-500: #7e7e7e;
|
|
54
|
+
--rt-neutral-600: #676767;
|
|
55
|
+
--rt-neutral-700: #515151;
|
|
56
|
+
--rt-neutral-800: #3c3c3c;
|
|
57
|
+
--rt-neutral-900: #282828;
|
|
58
|
+
--rt-neutral-950: #161616;
|
|
50
59
|
/* Бренд — линейка цвета марки. Потребитель перекрашивает кит объявлением этих
|
|
51
60
|
одиннадцати ступеней после tokens.css: назначения, прозрачные оттенки и кольцо
|
|
52
61
|
фокуса берут цвет отсюда сами, в обеих темах.
|
|
@@ -240,9 +249,12 @@
|
|
|
240
249
|
--rt-border-width-thick: 3px;
|
|
241
250
|
/* Alpha overlays — для backdrop'ов и focus-ring tint'ов. */
|
|
242
251
|
--rt-overlay-black-4: rgb(0 0 0 / 4%);
|
|
252
|
+
--rt-overlay-black-8: rgb(0 0 0 / 8%); /* наведение поверх приглушённой поверхности: она сама стоит на четырёх процентах */
|
|
243
253
|
--rt-overlay-white-4: rgb(255 255 255 / 4%);
|
|
254
|
+
--rt-overlay-white-8: rgb(255 255 255 / 8%); /* то же на графите */
|
|
244
255
|
--rt-overlay-white-25: rgb(250 250 250 / 25%); /* disabled-текст на графите */
|
|
245
|
-
--rt-overlay-white-40: rgb(250 250 250 / 40%); /*
|
|
256
|
+
--rt-overlay-white-40: rgb(250 250 250 / 40%); /* приглушённый знак: порога не берёт */
|
|
257
|
+
--rt-overlay-white-50: rgb(250 250 250 / 50%); /* приглушённый текст: слабее порог не берётся */
|
|
246
258
|
--rt-overlay-black-50: rgb(0 0 0 / 50%);
|
|
247
259
|
/* Оттенки марки считаются от её ступени, а не повторяют код цвета: повторённое
|
|
248
260
|
значение расходится с источником молча, и перекрасивший бренд получал бы прежний
|
|
@@ -272,7 +284,9 @@
|
|
|
272
284
|
--rt-bp-xl: 1380px;
|
|
273
285
|
}
|
|
274
286
|
|
|
275
|
-
/*
|
|
287
|
+
/* Собрано генератором `tools/build-tokens-v2.mjs` из `tokens.source.mjs` — правится там, не здесь:
|
|
288
|
+
правка на месте теряется на следующей сборке, и её называет `pnpm run check:tokens-build`. */
|
|
289
|
+
/* Назначения светлой темы.
|
|
276
290
|
|
|
277
291
|
Тело вынесено в @mixin по той же причине, что и у тёмной темы: набор нужен не
|
|
278
292
|
только на `:root`, но и на отдельном контейнере. Без этого светлую половину
|
|
@@ -282,9 +296,9 @@
|
|
|
282
296
|
/* Background */
|
|
283
297
|
--rt-color-bg-page: var(--rt-neutral-50);
|
|
284
298
|
--rt-color-bg-surface: var(--rt-neutral-0);
|
|
285
|
-
--rt-color-bg-surface-subtle: var(--rt-
|
|
299
|
+
--rt-color-bg-surface-subtle: var(--rt-overlay-black-4);
|
|
286
300
|
--rt-color-bg-surface-subtle-2: var(--rt-neutral-200);
|
|
287
|
-
--rt-color-bg-hover: var(--rt-
|
|
301
|
+
--rt-color-bg-hover: var(--rt-overlay-black-4);
|
|
288
302
|
--rt-color-bg-subtle: var(--rt-neutral-100);
|
|
289
303
|
--rt-color-bg-overlay: var(--rt-overlay-black-50);
|
|
290
304
|
--rt-color-bg-inverse: var(--rt-neutral-900);
|
|
@@ -296,16 +310,22 @@
|
|
|
296
310
|
--rt-color-text-primary: var(--rt-neutral-900);
|
|
297
311
|
/* Ступень 600, а не 500: приглушённый текст обязан брать порог, а после
|
|
298
312
|
пересчёта ряда самая светлая ступень, которая его берёт, — шестисотая.
|
|
299
|
-
Прежде эту роль держала off-grid ступень 510, заведённая ровно под неё.
|
|
313
|
+
Прежде эту роль держала off-grid ступень 510, заведённая ровно под неё.
|
|
314
|
+
|
|
315
|
+
Тёмный ответ — пятьдесят процентов белого, а не сорок: на сорока он давал
|
|
316
|
+
3.6:1 над поверхностью, 3.7:1 над страницей и 3.7:1 над фоном поля, то есть
|
|
317
|
+
не брал порога ни над одной подложкой. Светлую сторону под порог подводили,
|
|
318
|
+
тёмную забыли, и держал её список принятого. Пятьдесят — самая слабая доля,
|
|
319
|
+
берущая порог над всеми тремя: 4.86, 5.02 и 5.09. */
|
|
300
320
|
--rt-color-text-muted: var(--rt-neutral-600);
|
|
301
321
|
--rt-color-text-disabled: var(--rt-neutral-400);
|
|
302
322
|
--rt-color-text-inverse: var(--rt-neutral-0);
|
|
303
323
|
--rt-color-text-link: var(--rt-brand-500);
|
|
304
324
|
--rt-color-text-link-hover: var(--rt-brand-600);
|
|
305
325
|
/* Border */
|
|
306
|
-
--rt-color-border-default: var(--rt-neutral-
|
|
326
|
+
--rt-color-border-default: var(--rt-neutral-100);
|
|
307
327
|
--rt-color-border-strong: var(--rt-neutral-300);
|
|
308
|
-
--rt-color-border-subtle: var(--rt-neutral-
|
|
328
|
+
--rt-color-border-subtle: var(--rt-neutral-100);
|
|
309
329
|
--rt-color-border-focus: var(--rt-brand-500);
|
|
310
330
|
/* Action — роли действия.
|
|
311
331
|
|
|
@@ -437,7 +457,7 @@
|
|
|
437
457
|
/* Colors */
|
|
438
458
|
--rt-input-color-bg: var(--rt-color-bg-surface-subtle);
|
|
439
459
|
--rt-input-color-bg-disabled: var(--rt-color-bg-surface-subtle);
|
|
440
|
-
--rt-input-color-bg-hover: var(--rt-overlay-black-
|
|
460
|
+
--rt-input-color-bg-hover: var(--rt-overlay-black-8);
|
|
441
461
|
--rt-input-color-border: var(--rt-color-border-default);
|
|
442
462
|
--rt-input-color-border-focus: var(--rt-color-action-primary);
|
|
443
463
|
--rt-input-color-border-error: var(--rt-color-state-danger);
|
|
@@ -612,29 +632,35 @@
|
|
|
612
632
|
--rt-input-font-size: var(--rt-text-md);
|
|
613
633
|
}
|
|
614
634
|
}
|
|
615
|
-
/*
|
|
635
|
+
/* Собрано генератором `tools/build-tokens-v2.mjs` из `tokens.source.mjs` — правится там, не здесь:
|
|
636
|
+
правка на месте теряется на следующей сборке, и её называет `pnpm run check:tokens-build`. */
|
|
637
|
+
/* Тёмная тема — переопределение назначений; ступени шкалы неизменны.
|
|
616
638
|
|
|
617
|
-
Тело
|
|
639
|
+
Тело вынесено в @mixin, чтобы тот же набор переопределений можно было
|
|
618
640
|
применить не только на html-уровне (тема приложения), но и к локальному
|
|
619
641
|
контейнеру (side-by-side light/dark в Storybook) — без дублирования значений.
|
|
620
642
|
|
|
621
643
|
База (`rt-theme-dark-tokens`) — тёплый графит для приложений и всех
|
|
622
644
|
CDK-overlay'ев (асайды/диалоги/меню рендерятся на уровне body, вне
|
|
623
645
|
host-классов шеллов — поэтому графит держим на :root, иначе overlay'и
|
|
624
|
-
не наследовали бы палитру).
|
|
646
|
+
не наследовали бы палитру).
|
|
647
|
+
|
|
648
|
+
Значения ответов живут в источнике рядом со своим светлым назначением: забытая половина
|
|
649
|
+
пары видна там же, а не вылавливается сверкой двух файлов. */
|
|
625
650
|
:root[data-theme=dark],
|
|
626
651
|
html.rt-theme-dark {
|
|
627
652
|
/* Background — тёплый графит */
|
|
628
653
|
--rt-color-bg-page: var(--rt-charcoal-900);
|
|
629
654
|
--rt-color-bg-surface: var(--rt-charcoal-800);
|
|
630
655
|
--rt-color-bg-surface-subtle: var(--rt-charcoal-950);
|
|
656
|
+
--rt-color-bg-surface-subtle-2: var(--rt-charcoal-950);
|
|
631
657
|
--rt-color-bg-hover: var(--rt-charcoal-700);
|
|
632
658
|
--rt-color-bg-subtle: var(--rt-charcoal-950);
|
|
633
659
|
--rt-color-bg-overlay: rgb(0 0 0 / 70%);
|
|
634
660
|
--rt-color-bg-inverse: var(--rt-neutral-0);
|
|
635
661
|
/* Text — почти белый на графите */
|
|
636
662
|
--rt-color-text-primary: var(--rt-neutral-50);
|
|
637
|
-
--rt-color-text-muted: var(--rt-overlay-white-
|
|
663
|
+
--rt-color-text-muted: var(--rt-overlay-white-50);
|
|
638
664
|
--rt-color-text-disabled: var(--rt-overlay-white-25);
|
|
639
665
|
--rt-color-text-inverse: var(--rt-neutral-900);
|
|
640
666
|
--rt-color-text-link: var(--rt-brand-300);
|
|
@@ -694,7 +720,7 @@ html.rt-theme-dark {
|
|
|
694
720
|
/* Soft card-shadow в dark — насыщеннее для отделения от фона. */
|
|
695
721
|
--rt-shadow-card-soft: 0 0 40px rgb(0 0 0 / 25%);
|
|
696
722
|
/* Hover-overlay инвертирован для dark (light overlay поверх тёмного фона). */
|
|
697
|
-
--rt-input-color-bg-hover: var(--rt-overlay-white-
|
|
723
|
+
--rt-input-color-bg-hover: var(--rt-overlay-white-8);
|
|
698
724
|
--rt-icon-button-color-bg-hover: var(--rt-overlay-white-4);
|
|
699
725
|
/* Toggle-switch — трек уходит в подложку, а бегунок остаётся светлым:
|
|
700
726
|
общий bg-surface на обоих слил бы их в один силуэт. Тень на графите
|
|
@@ -726,6 +752,8 @@ html.rt-theme-dark {
|
|
|
726
752
|
--rt-color-bg-surface-auth-card: transparent;
|
|
727
753
|
}
|
|
728
754
|
|
|
755
|
+
/* Правила тёмной темы, которые свойств не объявляют. Стоят отдельно от `_theme-dark.scss`:
|
|
756
|
+
тот собирается генератором из источника и держит только объявления. */
|
|
729
757
|
/* Body-level градиент — подложка экранов авторизации: их вьюпорт прозрачен
|
|
730
758
|
(`--rt-color-bg-surface-auth-card: transparent`) и просвечивает body.
|
|
731
759
|
Остальные экраны его не видят — rt-container кроет body непрозрачным фоном
|
|
@@ -767,6 +795,94 @@ html.rt-theme-dark {
|
|
|
767
795
|
border: var(--rt-border-width-thin) solid var(--rt-color-bg-subtle);
|
|
768
796
|
}
|
|
769
797
|
}
|
|
798
|
+
@layer rt-kit.base {
|
|
799
|
+
.login__viewport {
|
|
800
|
+
display: flex;
|
|
801
|
+
min-height: 100dvh;
|
|
802
|
+
box-sizing: border-box;
|
|
803
|
+
align-items: center;
|
|
804
|
+
justify-content: center;
|
|
805
|
+
padding: 0 var(--rt-space-5);
|
|
806
|
+
background-color: var(--rt-color-bg-surface-auth-card);
|
|
807
|
+
}
|
|
808
|
+
.login__chrome {
|
|
809
|
+
position: fixed;
|
|
810
|
+
z-index: 10;
|
|
811
|
+
top: 20px;
|
|
812
|
+
right: 20px;
|
|
813
|
+
display: flex;
|
|
814
|
+
align-items: center;
|
|
815
|
+
gap: var(--rt-space-2);
|
|
816
|
+
}
|
|
817
|
+
.login__card {
|
|
818
|
+
position: relative;
|
|
819
|
+
display: flex;
|
|
820
|
+
width: 100%;
|
|
821
|
+
max-width: 400px;
|
|
822
|
+
box-sizing: border-box;
|
|
823
|
+
flex-direction: column;
|
|
824
|
+
align-items: stretch;
|
|
825
|
+
padding: var(--rt-space-16) var(--rt-space-5);
|
|
826
|
+
border-radius: var(--rt-radius-md);
|
|
827
|
+
background-color: var(--rt-color-bg-surface-auth-card);
|
|
828
|
+
gap: var(--rt-space-10);
|
|
829
|
+
}
|
|
830
|
+
.login__logo {
|
|
831
|
+
align-self: center;
|
|
832
|
+
}
|
|
833
|
+
.login__title {
|
|
834
|
+
margin: 0;
|
|
835
|
+
color: var(--rt-color-text-primary);
|
|
836
|
+
font-size: var(--rt-text-2xl);
|
|
837
|
+
font-weight: var(--rt-font-weight-bold);
|
|
838
|
+
text-align: center;
|
|
839
|
+
}
|
|
840
|
+
.login__form {
|
|
841
|
+
display: flex;
|
|
842
|
+
flex-direction: column;
|
|
843
|
+
gap: var(--rt-space-5);
|
|
844
|
+
}
|
|
845
|
+
.login__error {
|
|
846
|
+
padding: var(--rt-space-sm) var(--rt-space-4);
|
|
847
|
+
border-radius: var(--rt-radius-md);
|
|
848
|
+
margin: 0;
|
|
849
|
+
background-color: var(--rt-color-state-danger-bg);
|
|
850
|
+
color: var(--rt-color-state-error-text);
|
|
851
|
+
font-size: var(--rt-text-sm);
|
|
852
|
+
}
|
|
853
|
+
.login__submit {
|
|
854
|
+
width: 100%;
|
|
855
|
+
height: 40px;
|
|
856
|
+
}
|
|
857
|
+
.login__links {
|
|
858
|
+
display: flex;
|
|
859
|
+
flex-wrap: wrap;
|
|
860
|
+
justify-content: center;
|
|
861
|
+
padding-top: var(--rt-space-5);
|
|
862
|
+
border-top: var(--rt-border-width-thin) solid var(--rt-color-border-default);
|
|
863
|
+
gap: var(--rt-space-5);
|
|
864
|
+
}
|
|
865
|
+
.login__link {
|
|
866
|
+
padding: 0;
|
|
867
|
+
border: none;
|
|
868
|
+
background: transparent;
|
|
869
|
+
color: var(--rt-color-text-muted);
|
|
870
|
+
cursor: pointer;
|
|
871
|
+
font-size: var(--rt-text-xs);
|
|
872
|
+
font-weight: var(--rt-font-weight-medium);
|
|
873
|
+
letter-spacing: var(--rt-letter-spacing-wide);
|
|
874
|
+
text-decoration: underline;
|
|
875
|
+
text-decoration-thickness: 1px;
|
|
876
|
+
}
|
|
877
|
+
.login__link:hover {
|
|
878
|
+
color: var(--rt-color-action-primary);
|
|
879
|
+
}
|
|
880
|
+
.login__link:focus-visible {
|
|
881
|
+
border-radius: var(--rt-radius-xs);
|
|
882
|
+
outline: 2px solid var(--rt-color-action-primary);
|
|
883
|
+
outline-offset: 2px;
|
|
884
|
+
}
|
|
885
|
+
}
|
|
770
886
|
@layer rt-kit.components {
|
|
771
887
|
.rt-button {
|
|
772
888
|
/* Высота приходит общей шкалой контролов, а не своим числом: кнопка, поле и
|