@rt-tools/ui-kit-v2 0.33.0 → 0.34.1
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 +4 -3
- package/fesm2022/rt-tools-ui-kit-v2-ai-run-status.mjs +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-ai-run-status.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-autocomplete.mjs +92 -5
- package/fesm2022/rt-tools-ui-kit-v2-autocomplete.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-badge.mjs +191 -0
- package/fesm2022/rt-tools-ui-kit-v2-badge.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-breadcrumbs.mjs +3 -2
- package/fesm2022/rt-tools-ui-kit-v2-breadcrumbs.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-button.mjs +6 -1
- package/fesm2022/rt-tools-ui-kit-v2-button.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-checkbox.mjs +35 -4
- package/fesm2022/rt-tools-ui-kit-v2-checkbox.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-color-palette.mjs +13 -4
- package/fesm2022/rt-tools-ui-kit-v2-color-palette.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-container.mjs +245 -60
- package/fesm2022/rt-tools-ui-kit-v2-container.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-copy-value.mjs +30 -5
- package/fesm2022/rt-tools-ui-kit-v2-copy-value.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-core.mjs +113 -2
- package/fesm2022/rt-tools-ui-kit-v2-core.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-data-list.mjs +14 -3
- package/fesm2022/rt-tools-ui-kit-v2-data-list.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs +17 -3
- package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-date-picker.mjs +6 -3
- package/fesm2022/rt-tools-ui-kit-v2-date-picker.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-date-range.mjs +2 -2
- package/fesm2022/rt-tools-ui-kit-v2-date-range.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-divider.mjs +112 -0
- package/fesm2022/rt-tools-ui-kit-v2-divider.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-draggable-tree.mjs +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-draggable-tree.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-drawer.mjs +854 -0
- package/fesm2022/rt-tools-ui-kit-v2-drawer.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-dynamic-list.mjs +16 -5
- package/fesm2022/rt-tools-ui-kit-v2-dynamic-list.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-dynamic-selector.mjs +580 -65
- package/fesm2022/rt-tools-ui-kit-v2-dynamic-selector.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-expansion-panel.mjs +203 -15
- package/fesm2022/rt-tools-ui-kit-v2-expansion-panel.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-field.mjs +40 -8
- package/fesm2022/rt-tools-ui-kit-v2-field.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-file-card.mjs +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-file-card.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-filter-control.mjs +7 -3
- package/fesm2022/rt-tools-ui-kit-v2-filter-control.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-form-control.mjs +53 -2
- package/fesm2022/rt-tools-ui-kit-v2-form-control.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-hybrid-tree-selector.mjs +14 -4
- package/fesm2022/rt-tools-ui-kit-v2-hybrid-tree-selector.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-hybrid-tree.mjs +6 -3
- package/fesm2022/rt-tools-ui-kit-v2-hybrid-tree.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-icon-button.mjs +16 -5
- package/fesm2022/rt-tools-ui-kit-v2-icon-button.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-image-upload.mjs +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-image-upload.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-inline-edit.mjs +14 -4
- package/fesm2022/rt-tools-ui-kit-v2-inline-edit.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-input-number.mjs +3 -2
- package/fesm2022/rt-tools-ui-kit-v2-input-number.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-input.mjs +207 -7
- package/fesm2022/rt-tools-ui-kit-v2-input.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-menu.mjs +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-menu.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-multiselect.mjs +3 -2
- package/fesm2022/rt-tools-ui-kit-v2-multiselect.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs +2 -0
- package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-pagination.mjs +3 -2
- package/fesm2022/rt-tools-ui-kit-v2-pagination.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-profile-menu.mjs +3 -2
- package/fesm2022/rt-tools-ui-kit-v2-profile-menu.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-progress-bar.mjs +171 -0
- package/fesm2022/rt-tools-ui-kit-v2-progress-bar.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-radio-button.mjs +176 -6
- package/fesm2022/rt-tools-ui-kit-v2-radio-button.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs +2 -1
- package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-scroll-area.mjs +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-scroll-area.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-select.mjs +142 -23
- package/fesm2022/rt-tools-ui-kit-v2-select.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-side-menu.mjs +22 -9
- package/fesm2022/rt-tools-ui-kit-v2-side-menu.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-speed-menu.mjs +3 -2
- package/fesm2022/rt-tools-ui-kit-v2-speed-menu.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-stepper.mjs +105 -8
- package/fesm2022/rt-tools-ui-kit-v2-stepper.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-table.mjs +13 -2
- package/fesm2022/rt-tools-ui-kit-v2-table.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-tabs.mjs +654 -43
- package/fesm2022/rt-tools-ui-kit-v2-tabs.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-tag.mjs +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-tag.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-textarea.mjs +45 -7
- package/fesm2022/rt-tools-ui-kit-v2-textarea.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-theme-toggle.mjs +2 -2
- package/fesm2022/rt-tools-ui-kit-v2-theme-toggle.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-thread-list.mjs +11 -2
- package/fesm2022/rt-tools-ui-kit-v2-thread-list.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-toast.mjs +152 -11
- package/fesm2022/rt-tools-ui-kit-v2-toast.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-toggle-button-group.mjs +199 -17
- package/fesm2022/rt-tools-ui-kit-v2-toggle-button-group.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-tooltip.mjs +35 -5
- package/fesm2022/rt-tools-ui-kit-v2-tooltip.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-tree-selector.mjs +14 -4
- package/fesm2022/rt-tools-ui-kit-v2-tree-selector.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-tree.mjs +6 -3
- package/fesm2022/rt-tools-ui-kit-v2-tree.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-workspace-details.mjs +21 -6
- package/fesm2022/rt-tools-ui-kit-v2-workspace-details.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2.mjs +4 -0
- package/package.json +17 -1
- package/src/assets/icons/volume-off.svg +2 -1
- package/src/lib/components/autocomplete/CONTEXT.md +25 -14
- package/src/lib/components/autocomplete/rt-autocomplete.component.scss +19 -0
- package/src/lib/components/badge/CONTEXT.md +33 -0
- package/src/lib/components/badge/rt-badge.directive.scss +104 -0
- package/src/lib/components/breadcrumbs/rt-breadcrumbs.component.scss +2 -2
- package/src/lib/components/button/CONTEXT.md +5 -0
- package/src/lib/components/button/rt-button.directive.scss +3 -1
- package/src/lib/components/checkbox/CONTEXT.md +15 -8
- package/src/lib/components/color-palette/rt-color-palette.component.scss +2 -2
- package/src/lib/components/container/CONTEXT.md +23 -6
- package/src/lib/components/container/rt-container.component.scss +90 -1
- package/src/lib/components/copy-value/CONTEXT.md +6 -5
- package/src/lib/components/copy-value/rt-copy-value.component.scss +16 -0
- package/src/lib/components/date-picker/rt-date-picker.component.scss +7 -0
- package/src/lib/components/date-range/rt-date-range.component.scss +7 -0
- package/src/lib/components/divider/CONTEXT.md +21 -0
- package/src/lib/components/divider/rt-divider.component.scss +34 -0
- package/src/lib/components/drawer/CONTEXT.md +73 -0
- package/src/lib/components/drawer/rt-drawer-container.component.scss +19 -0
- package/src/lib/components/drawer/rt-drawer.component.scss +168 -0
- package/src/lib/components/drawer/rt-resize-handle.component.scss +42 -0
- package/src/lib/components/dynamic-selector/CONTEXT.md +5 -0
- package/src/lib/components/expansion-panel/CONTEXT.md +32 -8
- package/src/lib/components/expansion-panel/rt-expansion-panel.component.scss +67 -2
- package/src/lib/components/field/CONTEXT.md +43 -0
- package/src/lib/components/field/rt-field-label-inside.scss +179 -0
- package/src/lib/components/field/rt-field.component.scss +51 -2
- package/src/lib/components/icon-button/CONTEXT.md +17 -15
- package/src/lib/components/icon-button/rt-icon-button.component.scss +3 -1
- package/src/lib/components/inline-edit/rt-inline-edit.component.scss +4 -4
- package/src/lib/components/input/CONTEXT.md +45 -11
- package/src/lib/components/input/rt-input-floating-label.scss +192 -0
- package/src/lib/components/input/rt-input-icons.scss +105 -0
- package/src/lib/components/input/rt-input.component.scss +91 -13
- package/src/lib/components/input-number/CONTEXT.md +7 -0
- package/src/lib/components/input-number/rt-input-number.component.scss +58 -1
- package/src/lib/components/menu/CONTEXT.md +1 -0
- package/src/lib/components/multiselect/CONTEXT.md +2 -1
- package/src/lib/components/multiselect/rt-multiselect.component.scss +7 -0
- package/src/lib/components/pagination/CONTEXT.md +3 -0
- package/src/lib/components/pagination/rt-pagination.component.scss +7 -0
- package/src/lib/components/progress-bar/CONTEXT.md +22 -0
- package/src/lib/components/progress-bar/rt-progress-bar.component.scss +77 -0
- package/src/lib/components/radio-button/CONTEXT.md +9 -0
- package/src/lib/components/radio-button/rt-radio-group.component.scss +13 -0
- package/src/lib/components/select/CONTEXT.md +28 -0
- package/src/lib/components/select/rt-select-clear.scss +88 -0
- package/src/lib/components/select/rt-select-floating-label.scss +155 -0
- package/src/lib/components/select/rt-select-material.scss +54 -0
- package/src/lib/components/select/rt-select.component.scss +54 -16
- package/src/lib/components/side-menu/CONTEXT.md +5 -0
- package/src/lib/components/speed-menu/rt-speed-menu.component.scss +5 -5
- package/src/lib/components/stepper/CONTEXT.md +13 -5
- package/src/lib/components/stepper/rt-stepper.component.scss +93 -0
- package/src/lib/components/tabs/CONTEXT.md +61 -9
- package/src/lib/components/tabs/rt-tabs.component.scss +201 -5
- package/src/lib/components/textarea/CONTEXT.md +12 -1
- package/src/lib/components/textarea/rt-textarea.component.scss +116 -1
- package/src/lib/components/toast/CONTEXT.md +23 -0
- package/src/lib/components/toast/rt-toast.component.scss +37 -0
- package/src/lib/components/toggle-button-group/CONTEXT.md +24 -4
- package/src/lib/components/toggle-button-group/rt-toggle-button-group-chips.scss +151 -0
- package/src/lib/components/toggle-button-group/rt-toggle-button-group.component.scss +35 -0
- package/src/lib/components/tooltip/CONTEXT.md +7 -1
- package/src/lib/components/tree/rt-tree.component.scss +2 -2
- package/src/styles/_color-scheme.scss +1 -1
- package/src/styles/_density.scss +48 -0
- package/src/styles/_index.scss +8 -0
- package/src/styles/_preset-material.scss +160 -70
- package/src/styles/_primitives.scss +1 -0
- package/src/styles/_semantic-navigation.scss +117 -0
- package/src/styles/_semantic.scss +29 -98
- package/src/styles/_theme-dark.scss +8 -0
- package/styles/tokens.css +2066 -1134
- package/types/rt-tools-ui-kit-v2-autocomplete.d.ts +34 -0
- package/types/rt-tools-ui-kit-v2-badge.d.ts +71 -0
- package/types/rt-tools-ui-kit-v2-checkbox.d.ts +17 -3
- package/types/rt-tools-ui-kit-v2-container.d.ts +65 -9
- package/types/rt-tools-ui-kit-v2-copy-value.d.ts +11 -1
- package/types/rt-tools-ui-kit-v2-core.d.ts +109 -4
- package/types/rt-tools-ui-kit-v2-divider.d.ts +29 -0
- package/types/rt-tools-ui-kit-v2-drawer.d.ts +257 -0
- package/types/rt-tools-ui-kit-v2-dynamic-selector.d.ts +240 -25
- package/types/rt-tools-ui-kit-v2-expansion-panel.d.ts +87 -3
- package/types/rt-tools-ui-kit-v2-field.d.ts +18 -1
- package/types/rt-tools-ui-kit-v2-form-control.d.ts +42 -4
- package/types/rt-tools-ui-kit-v2-icon-button.d.ts +2 -1
- package/types/rt-tools-ui-kit-v2-input-number.d.ts +1 -0
- package/types/rt-tools-ui-kit-v2-input.d.ts +98 -4
- package/types/rt-tools-ui-kit-v2-progress-bar.d.ts +53 -0
- package/types/rt-tools-ui-kit-v2-radio-button.d.ts +80 -1
- package/types/rt-tools-ui-kit-v2-select.d.ts +65 -1
- package/types/rt-tools-ui-kit-v2-side-menu.d.ts +3 -0
- package/types/rt-tools-ui-kit-v2-stepper.d.ts +57 -4
- package/types/rt-tools-ui-kit-v2-tabs.d.ts +337 -8
- package/types/rt-tools-ui-kit-v2-textarea.d.ts +16 -0
- package/types/rt-tools-ui-kit-v2-toast.d.ts +38 -2
- package/types/rt-tools-ui-kit-v2-toggle-button-group.d.ts +83 -3
- package/types/rt-tools-ui-kit-v2-tooltip.d.ts +17 -2
- package/types/rt-tools-ui-kit-v2.d.ts +4 -0
- package/src/lib/components/dynamic-selector/stories/component/test-dynamic-selector-popup-frame.component.scss +0 -6
|
@@ -1,9 +1,17 @@
|
|
|
1
1
|
@use '../../../styles/mixins' as kv;
|
|
2
2
|
|
|
3
3
|
@layer rt-kit.components {
|
|
4
|
+
/* Признак набора — на предке или на самом поле: приложение ставит его и на тег контрола. */
|
|
5
|
+
$preset: ':is(.rt-preset-material *, [data-preset="material"] *, .rt-preset-material, [data-preset="material"])';
|
|
6
|
+
$preset-weak: ':where(.rt-preset-material *, [data-preset="material"] *, .rt-preset-material, [data-preset="material"])';
|
|
7
|
+
|
|
4
8
|
.rt-input-number {
|
|
5
9
|
--rt-input-number-radius: var(--rt-input-radius);
|
|
6
10
|
--rt-input-number-fill-radius: var(--rt-radius-sm);
|
|
11
|
+
--rt-input-number-color-border-hover: var(--rt-color-text-primary);
|
|
12
|
+
|
|
13
|
+
/* Толщина боковой рамки: от неё под материальным набором считается отступ текста. */
|
|
14
|
+
--rt-input-number-edge: var(--rt-input-border-width);
|
|
7
15
|
|
|
8
16
|
position: relative;
|
|
9
17
|
display: inline-flex;
|
|
@@ -29,6 +37,12 @@
|
|
|
29
37
|
outline-offset: var(--rt-input-focus-outline-offset);
|
|
30
38
|
}
|
|
31
39
|
|
|
40
|
+
/* Наведение в материальном наборе — как у поля Material: рамка цвета текста. `:where` держит
|
|
41
|
+
силу правила на уровне вида, и фокус, ошибка, залитый вид и «без рамки» его перекрывают. */
|
|
42
|
+
&#{$preset-weak}:where(:hover:not(:has(:disabled))) {
|
|
43
|
+
border-color: var(--rt-input-number-color-border-hover);
|
|
44
|
+
}
|
|
45
|
+
|
|
32
46
|
/* bordered=false: снимаем только resting-рамку; invalid/focus/readonly идут
|
|
33
47
|
ниже по source-order и перекрывают её своей рамкой. */
|
|
34
48
|
&--borderless {
|
|
@@ -40,6 +54,9 @@
|
|
|
40
54
|
Объявлен до блоков состояний: фокус, ошибка и «только чтение» идут ниже и
|
|
41
55
|
перекрывают его рамку. */
|
|
42
56
|
&--appearance--fill {
|
|
57
|
+
--rt-input-number-edge: var(--rt-input-fill-edge);
|
|
58
|
+
|
|
59
|
+
border-width: var(--rt-input-fill-edge) var(--rt-input-fill-edge) var(--rt-input-border-width);
|
|
43
60
|
border-color: transparent;
|
|
44
61
|
border-radius: var(--rt-input-number-fill-radius) var(--rt-input-number-fill-radius) 0 0;
|
|
45
62
|
border-bottom-color: var(--rt-color-field-fill-underline);
|
|
@@ -69,9 +86,40 @@
|
|
|
69
86
|
}
|
|
70
87
|
}
|
|
71
88
|
|
|
89
|
+
/* Фокус залитого поля: в материальном наборе — черта снизу вдвое толще, как у поля ввода. */
|
|
90
|
+
&--appearance--fill:focus-within {
|
|
91
|
+
box-shadow: var(--rt-input-fill-focus-shadow);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
&--appearance--fill.rt-input-number--invalid:focus-within {
|
|
95
|
+
box-shadow: var(--rt-input-fill-focus-shadow-error);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/* Отключённое поле в материальном наборе не тускнеет, а красит рамку, текст и подсказку —
|
|
99
|
+
как поле ввода. Своим видом цвета равны обычным. */
|
|
72
100
|
&--disabled {
|
|
101
|
+
color: var(--rt-input-color-text-disabled);
|
|
73
102
|
cursor: not-allowed;
|
|
74
|
-
opacity: var(--rt-input-disabled-opacity);
|
|
103
|
+
opacity: var(--rt-input-disabled-field-opacity);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/* Отключённое залитое поле в наборе залито, как поле Material: on-surface 4 %. */
|
|
107
|
+
&--appearance--fill.rt-input-number--disabled {
|
|
108
|
+
background-color: var(--rt-input-fill-color-bg-disabled);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
&--disabled:not(
|
|
112
|
+
.rt-input-number--invalid,
|
|
113
|
+
.rt-input-number--appearance--fill,
|
|
114
|
+
.rt-input-number--appearance--pill,
|
|
115
|
+
.rt-input-number--borderless,
|
|
116
|
+
.rt-input-number--readonly
|
|
117
|
+
) {
|
|
118
|
+
border-color: var(--rt-input-color-border-disabled);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
&--disabled &__field::placeholder {
|
|
122
|
+
color: var(--rt-input-color-placeholder-disabled);
|
|
75
123
|
}
|
|
76
124
|
|
|
77
125
|
&--size--sm {
|
|
@@ -82,6 +130,12 @@
|
|
|
82
130
|
min-height: var(--rt-input-height-lg);
|
|
83
131
|
}
|
|
84
132
|
|
|
133
|
+
/* Текст поля Material начинается в 16 px от внешнего края поля, рамка входит в этот отступ.
|
|
134
|
+
Своим видом кита отступ считается от рамки. Поле только для чтения ниже снимает отступ. */
|
|
135
|
+
&#{$preset-weak} {
|
|
136
|
+
padding-inline: calc(var(--rt-input-padding-x) - var(--rt-input-number-edge));
|
|
137
|
+
}
|
|
138
|
+
|
|
85
139
|
/* Read-only: плоский текст вместо input — снимаем рамку/фон/паддинги. */
|
|
86
140
|
&--readonly {
|
|
87
141
|
padding-right: 0;
|
|
@@ -108,6 +162,9 @@
|
|
|
108
162
|
background: transparent;
|
|
109
163
|
color: inherit;
|
|
110
164
|
font: inherit;
|
|
165
|
+
|
|
166
|
+
/* Межбуквенный интервал значения — ручка приложения: кит её не объявляет, без неё normal. */
|
|
167
|
+
letter-spacing: var(--rt-input-letter-spacing, normal);
|
|
111
168
|
outline: none;
|
|
112
169
|
|
|
113
170
|
&::placeholder {
|
|
@@ -92,6 +92,7 @@ Ctrl/Cmd-click, Shift-click и средняя кнопка открывают н
|
|
|
92
92
|
- Отключённый пункт не выбирается и меню не закрывает: он выпадает из таб-порядка (`tabindex`
|
|
93
93
|
снимается) и помечается `aria-disabled`.
|
|
94
94
|
- Enter и Space на пункте работают как клик.
|
|
95
|
+
- `Escape` закрывает только меню и не доходит до боковой панели или окна под ним.
|
|
95
96
|
- Пункты для хода стрелками меню берёт из разметки панели, а не запросом компонентов: таблица
|
|
96
97
|
кладёт их шаблоном приложения, и запрос содержимого меню их не видит.
|
|
97
98
|
- Панель объявлена `role="menu"`, пункт — `role="menuitem"`.
|
|
@@ -40,7 +40,8 @@
|
|
|
40
40
|
## Клавиатура
|
|
41
41
|
|
|
42
42
|
Как у [`rt-select`](../select/CONTEXT.md), с одним отличием: `Enter`/`Space` **переключают**
|
|
43
|
-
подсвеченную опцию, оставляя список открытым.
|
|
43
|
+
подсвеченную опцию, оставляя список открытым. `Escape` закрывает только список и не доходит до
|
|
44
|
+
боковой панели или окна под ним.
|
|
44
45
|
|
|
45
46
|
## Дерево опций
|
|
46
47
|
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
--rt-multiselect-radius: var(--rt-input-radius);
|
|
6
6
|
--rt-multiselect-caret-transition-duration: var(--rt-duration-fast);
|
|
7
7
|
--rt-multiselect-own-outline-width: var(--rt-border-width-medium);
|
|
8
|
+
--rt-multiselect-color-border-hover: var(--rt-color-text-primary);
|
|
8
9
|
|
|
9
10
|
position: relative;
|
|
10
11
|
display: block;
|
|
@@ -53,6 +54,12 @@
|
|
|
53
54
|
}
|
|
54
55
|
}
|
|
55
56
|
|
|
57
|
+
/* Наведение в материальном наборе — как у поля Material: рамка цвета текста. Сила правила —
|
|
58
|
+
на уровне кнопки, поэтому фокус, открытый список, ошибка и «без рамки» его перекрывают. */
|
|
59
|
+
:where(.rt-preset-material, [data-preset='material']) &__trigger:where(:hover:not(:disabled)) {
|
|
60
|
+
border-color: var(--rt-multiselect-color-border-hover);
|
|
61
|
+
}
|
|
62
|
+
|
|
56
63
|
/* Свой указатель потребителя: полевой вид кнопки снимается — ground, рамка, высота и
|
|
57
64
|
отступы. Останется он — значок или метка потребителя окажутся внутри чужого поля, и
|
|
58
65
|
вход теряет смысл. Поведение при этом на кнопке, снимается только вид.
|
|
@@ -32,6 +32,9 @@
|
|
|
32
32
|
|
|
33
33
|
## Края
|
|
34
34
|
|
|
35
|
+
- Размер шрифта значения «на странице» — ручка `--rt-pagination-field-font-size`. Без неё значение
|
|
36
|
+
берёт размер поля `--rt-input-font-size`, под материальным набором 16px; `var(--rt-text-sm)` ровняет
|
|
37
|
+
его с номерами страниц.
|
|
35
38
|
- Во время загрузки заблокированы и номера, и стрелки — иначе второй клик ушёл бы поверх ещё
|
|
36
39
|
не пришедшего ответа.
|
|
37
40
|
- Полоса номеров показывает первую, последнюю и по одному соседу открытой страницы; между ними —
|
|
@@ -118,6 +118,13 @@
|
|
|
118
118
|
gap: var(--rt-pagination-per-page-gap);
|
|
119
119
|
}
|
|
120
120
|
|
|
121
|
+
/* Размер шрифта значения «на странице» — ручка приложения: кит её не объявляет, без неё
|
|
122
|
+
значение остаётся размером поля. Не через --rt-input-font-size: свойство, читающее само
|
|
123
|
+
себя запасным, браузер считает недействительным. */
|
|
124
|
+
&__per-page .rt-select__trigger {
|
|
125
|
+
font-size: var(--rt-pagination-field-font-size, var(--rt-input-font-size));
|
|
126
|
+
}
|
|
127
|
+
|
|
121
128
|
// Свой вид переносит подпись: на узком экране поле иначе уходит за край. Материальный набор
|
|
122
129
|
// держит её в строку, как первый кит.
|
|
123
130
|
&__per-page-label {
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# `rt-progress-bar`
|
|
2
|
+
|
|
3
|
+
```html
|
|
4
|
+
<rt-progress-bar ariaLabel="Обновление набора данных" color="success" [value]="percent()" />
|
|
5
|
+
```
|
|
6
|
+
|
|
7
|
+
| вход | тип | умолчание |
|
|
8
|
+
| ----------- | ---------------------------------- | --------------- |
|
|
9
|
+
| `mode` | `'determinate' \| 'indeterminate'` | `'determinate'` |
|
|
10
|
+
| `value` | `number` | `0` |
|
|
11
|
+
| `color` | `IRtProgressBar.Color` | `'primary'` |
|
|
12
|
+
| `ariaLabel` | `string \| null` | `null` |
|
|
13
|
+
|
|
14
|
+
Выходов нет.
|
|
15
|
+
|
|
16
|
+
## Главное, что нужно знать
|
|
17
|
+
|
|
18
|
+
**Доля зажата в 0–100 одним местом — `clampProgress`.** Ширина заполнения и `aria-valuenow`
|
|
19
|
+
берут одно и то же число и разойтись не могут.
|
|
20
|
+
|
|
21
|
+
**Живая доля — просто сигнал на входе.** Заполнение идёт за ним движением ширины; полоса в
|
|
22
|
+
уведомлении получает долю из потока задачи.
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
@layer rt-kit.components {
|
|
2
|
+
/* rt-progress-bar — полоса прогресса. ViewEncapsulation.None: хост — дорожка, внутри заполнение. */
|
|
3
|
+
.rt-progress-bar {
|
|
4
|
+
--rt-progress-bar-height: var(--rt-size-1);
|
|
5
|
+
--rt-progress-bar-radius: var(--rt-radius-full);
|
|
6
|
+
--rt-progress-bar-track: var(--rt-color-border-default);
|
|
7
|
+
--rt-progress-bar-fill: var(--rt-color-action-primary);
|
|
8
|
+
--rt-progress-bar-duration: var(--rt-duration-base);
|
|
9
|
+
--rt-progress-bar-sweep-duration: var(--rt-duration-slower);
|
|
10
|
+
|
|
11
|
+
position: relative;
|
|
12
|
+
display: block;
|
|
13
|
+
overflow: hidden;
|
|
14
|
+
width: 100%;
|
|
15
|
+
height: var(--rt-progress-bar-height);
|
|
16
|
+
border-radius: var(--rt-progress-bar-radius);
|
|
17
|
+
background: var(--rt-progress-bar-track);
|
|
18
|
+
|
|
19
|
+
&__fill {
|
|
20
|
+
position: absolute;
|
|
21
|
+
display: block;
|
|
22
|
+
border-radius: inherit;
|
|
23
|
+
background: var(--rt-progress-bar-fill);
|
|
24
|
+
inset-block: 0;
|
|
25
|
+
inset-inline-start: 0;
|
|
26
|
+
transition: width var(--rt-progress-bar-duration) ease-out;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/* Без доли бежит отрезок в треть дорожки: от левого края за правый, по кругу. */
|
|
30
|
+
&--indeterminate &__fill {
|
|
31
|
+
width: 35%;
|
|
32
|
+
animation: rt-progress-bar-sweep calc(var(--rt-progress-bar-sweep-duration) * 3) ease-in-out infinite;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
&--color--secondary {
|
|
36
|
+
--rt-progress-bar-fill: var(--rt-color-action-secondary);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
&--color--info {
|
|
40
|
+
--rt-progress-bar-fill: var(--rt-color-action-info);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
&--color--success {
|
|
44
|
+
--rt-progress-bar-fill: var(--rt-color-action-success);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
&--color--warning {
|
|
48
|
+
--rt-progress-bar-fill: var(--rt-color-action-warning);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
&--color--danger {
|
|
52
|
+
--rt-progress-bar-fill: var(--rt-color-action-danger);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
@media (prefers-reduced-motion: reduce) {
|
|
56
|
+
&__fill {
|
|
57
|
+
transition: none;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/* Без движения полоса без доли стоит залитой целиком: «идёт работа» читается и так. */
|
|
61
|
+
&--indeterminate &__fill {
|
|
62
|
+
width: 100%;
|
|
63
|
+
animation: none;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
@keyframes rt-progress-bar-sweep {
|
|
69
|
+
from {
|
|
70
|
+
inset-inline-start: -35%;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
to {
|
|
74
|
+
inset-inline-start: 100%;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
@@ -37,6 +37,15 @@
|
|
|
37
37
|
Для таблицы и списков — вход `checked`.
|
|
38
38
|
- Кружок без подписи получает имя через `ariaLabel`.
|
|
39
39
|
|
|
40
|
+
## Группа
|
|
41
|
+
|
|
42
|
+
`<rt-radio-group ariaLabel="Город" orientation="vertical">` объявляет `role="radiogroup"` вокруг
|
|
43
|
+
радиокнопок. Стрелки выбирают следующую доступную радиокнопку по кругу и переводят на неё фокус.
|
|
44
|
+
Tab останавливается в группе один раз: на выбранной, без выбора — на первой доступной.
|
|
45
|
+
|
|
46
|
+
Радиокнопки записываются в группу сами, через её токен, поэтому радиокнопка внутри своей обёртки
|
|
47
|
+
приложения тоже ходит стрелками. Порядок обхода — порядок в разметке, а не порядок записи.
|
|
48
|
+
|
|
40
49
|
## Рядом
|
|
41
50
|
|
|
42
51
|
- [`rt-checkbox`](../checkbox/CONTEXT.md) — независимый выбор «да / нет».
|
|
@@ -15,10 +15,16 @@
|
|
|
15
15
|
| `iconLeft` | `IRtIcon.Name \| null` | `null` |
|
|
16
16
|
| `filter` | `boolean` | `false` |
|
|
17
17
|
| `filterPlaceholder` | `string` | `''` → `uiSearch` |
|
|
18
|
+
| `floatingLabel` | `string \| null` | `null` |
|
|
18
19
|
|
|
19
20
|
| выход | тип |
|
|
20
21
|
| ----------------- | ---------------- |
|
|
21
22
|
| `selectionChange` | `TValue \| null` |
|
|
23
|
+
| `cleared` | `void` |
|
|
24
|
+
|
|
25
|
+
Своя разметка строки — шаблон `<ng-template rtSelectOption let-option let-selected="selected">`.
|
|
26
|
+
Она встаёт на место подписи пункта и ею же поле рисует выбранное значение: цветная метка из списка
|
|
27
|
+
остаётся в поле после выбора. Стрелка ветки, галочка, выбор и клавиши остаются у кита.
|
|
22
28
|
|
|
23
29
|
## Главное, что нужно знать
|
|
24
30
|
|
|
@@ -48,6 +54,12 @@
|
|
|
48
54
|
|
|
49
55
|
## Края
|
|
50
56
|
|
|
57
|
+
- `floatingLabel` кладёт подпись на место подсказки пустого поля и поднимает её на рамку, когда
|
|
58
|
+
значение выбрано или список открыт. Рамка под поднятой подписью разрывается. Подпись вместе с
|
|
59
|
+
выбранным значением называет кнопку скринридеру, если своего `ariaLabel` нет.
|
|
60
|
+
- С `clearTabbable` крестик — соседняя кнопка поверх своего места в строке, а не кнопка внутри
|
|
61
|
+
кнопки: вложенную скринридер не объявляет, а её Enter открывал бы список.
|
|
62
|
+
- `Escape` в открытом списке закрывает только список и не доходит до слоя под ним.
|
|
51
63
|
- Закрытие списка помечает контрол тронутым и сбрасывает строку фильтра.
|
|
52
64
|
- `FormControl.disable()` **закрывает уже раскрытый** список — иначе панель висела бы над
|
|
53
65
|
контролом, которым уже нельзя пользоваться.
|
|
@@ -58,6 +70,22 @@
|
|
|
58
70
|
- Высота панели упирается в предел кита `--rt-input-panel-max-height`, длинный список
|
|
59
71
|
прокручивается внутри. Вход `panelMaxHeight` ставит свой предел, `none` снимает его.
|
|
60
72
|
|
|
73
|
+
**Под набором крестик не выше поля без рамки, наименьшая ширина — свойство.** Как у поля ввода:
|
|
74
|
+
ступень `size` ставит `--rt-input-height`, и под материальным набором крестик и его место в строке
|
|
75
|
+
считаются от неё; свой вид кита держит размер кнопки. Наименьшая ширина —
|
|
76
|
+
`--rt-input-min-width`, по умолчанию её нет.
|
|
77
|
+
|
|
78
|
+
**Под материальным набором текст стоит в 16 px от внешнего края, а отключённый выбор не тускнеет.**
|
|
79
|
+
Рамка у отключённого выбора — `on-surface` 12 %, текст, подсказка и стрелка — 38 %. Эти правила
|
|
80
|
+
лежат в четвёртом листе стилей компонента: с ними основной лист перешёл бы порог в 8 КБ.
|
|
81
|
+
|
|
82
|
+
## Межбуквенный интервал
|
|
83
|
+
|
|
84
|
+
Выбранное значение берёт интервал из ручки `--rt-input-letter-spacing`, общей с полем, числом и
|
|
85
|
+
текстом. Кит её не объявляет: без неё значение наследует интервал от приложения, как раньше.
|
|
86
|
+
|
|
87
|
+
Отключённый выбор со своим указателем (`rtSelectTrigger`) рамки не получает ни в одном наборе.
|
|
88
|
+
|
|
61
89
|
## Рядом
|
|
62
90
|
|
|
63
91
|
- [`rt-multiselect`](../multiselect/CONTEXT.md) — тот же список, но с несколькими значениями.
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
@layer rt-kit.components {
|
|
2
|
+
/* Признак набора — на предке или на самом поле: приложение ставит его и на тег контрола. */
|
|
3
|
+
$preset: ':is(.rt-preset-material *, [data-preset="material"] *, .rt-preset-material, [data-preset="material"])';
|
|
4
|
+
$preset-weak: ':where(.rt-preset-material *, [data-preset="material"] *, .rt-preset-material, [data-preset="material"])';
|
|
5
|
+
|
|
6
|
+
/* Крестик — его размер и порядок обхода (`clearTabbable`) — отдельный лист стилей компонента:
|
|
7
|
+
основной лист стоит у порога в 8 КБ, который Angular по умолчанию ставит приложению. Крестик
|
|
8
|
+
не выше поля без рамки. Крестик в порядке обхода — соседняя
|
|
9
|
+
кнопка поверх своего места в строке указателя: место держит пустая ячейка той же ширины, и
|
|
10
|
+
подпись выбора не заходит под крестик. */
|
|
11
|
+
.rt-select {
|
|
12
|
+
--rt-select-chevron-width: var(--rt-size-4);
|
|
13
|
+
|
|
14
|
+
/* Ступень размера — высота поля целиком: по ней считаются и крестик, и его место. */
|
|
15
|
+
&--size--sm {
|
|
16
|
+
--rt-input-height: var(--rt-input-height-sm);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
&--size--lg {
|
|
20
|
+
--rt-input-height: var(--rt-input-height-lg);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/* Размер, значок и цвет крестика — свойства поля ввода: набор оформления даёт крестику
|
|
24
|
+
выбора тот же вид первого кита. */
|
|
25
|
+
&__clear {
|
|
26
|
+
--rt-icon-color-muted: var(--rt-input-clear-color);
|
|
27
|
+
--rt-icon-step-sm: var(--rt-input-clear-icon-size);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/* Под набором крестик не выше поля без рамки — как у поля ввода. Свой вид кита держит
|
|
31
|
+
прежний размер кнопки: малое поле с крестиком в нём 34 px, как до набора. Свой размер
|
|
32
|
+
приложение задаёт свойством `--rt-input-clear-size`. */
|
|
33
|
+
&#{$preset-weak} &__clear .rt-icon-button {
|
|
34
|
+
width: min(var(--rt-input-clear-size), calc(var(--rt-input-height) - 2 * var(--rt-input-border-width)));
|
|
35
|
+
height: min(var(--rt-input-clear-size), calc(var(--rt-input-height) - 2 * var(--rt-input-border-width)));
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
& &__clear .rt-icon-button {
|
|
39
|
+
--rt-icon-button-radius: var(--rt-input-clear-radius);
|
|
40
|
+
--rt-icon-button-bg-variant: var(--rt-input-clear-bg);
|
|
41
|
+
--rt-icon-button-color-bg-hover: var(--rt-input-clear-bg-hover);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
&__clear-slot {
|
|
45
|
+
width: var(--rt-input-clear-size);
|
|
46
|
+
height: var(--rt-input-clear-size);
|
|
47
|
+
flex-shrink: 0;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
&#{$preset-weak} &__clear-slot {
|
|
51
|
+
width: min(var(--rt-input-clear-size), calc(var(--rt-input-height) - 2 * var(--rt-input-border-width)));
|
|
52
|
+
height: min(var(--rt-input-clear-size), calc(var(--rt-input-height) - 2 * var(--rt-input-border-width)));
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
&__clear--outside {
|
|
56
|
+
position: absolute;
|
|
57
|
+
top: 50%;
|
|
58
|
+
right: calc(var(--rt-select-text-inset) + var(--rt-select-chevron-width) + var(--rt-space-sm));
|
|
59
|
+
transform: translateY(-50%);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
&--readonly &__clear--outside {
|
|
63
|
+
display: none;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/* Под материальным набором стрелка — залитый треугольник mat-select первого кита, 10 на 5 px.
|
|
67
|
+
Открытое поле переворачивает его, как mat-select, правилом `--open` основного листа. Свой вид кита
|
|
68
|
+
остаётся с шевроном. Размер значок ставит себе встроенным стилем, поэтому треугольник задан
|
|
69
|
+
пределами, а не шириной. */
|
|
70
|
+
&#{$preset} &__chevron {
|
|
71
|
+
--rt-icon-color-muted: var(--rt-input-icon-color);
|
|
72
|
+
|
|
73
|
+
max-width: 10px;
|
|
74
|
+
max-height: 5px;
|
|
75
|
+
background-color: currentcolor;
|
|
76
|
+
clip-path: polygon(0 0, 100% 0, 50% 100%);
|
|
77
|
+
|
|
78
|
+
svg {
|
|
79
|
+
display: none;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/* Под материальным набором стрелка — треугольник шириной 10 px, а не значок. */
|
|
84
|
+
&#{$preset} {
|
|
85
|
+
--rt-select-chevron-width: 10px;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
@layer rt-kit.components {
|
|
2
|
+
/* Признак набора — на предке или на самом поле: приложение ставит его и на тег контрола. */
|
|
3
|
+
$preset: ':is(.rt-preset-material *, [data-preset="material"] *, .rt-preset-material, [data-preset="material"])';
|
|
4
|
+
$preset-weak: ':where(.rt-preset-material *, [data-preset="material"] *, .rt-preset-material, [data-preset="material"])';
|
|
5
|
+
|
|
6
|
+
/* Подпись на рамке и разрыв рамки под ней — отдельный лист стилей компонента. Одним листом с
|
|
7
|
+
остальными правилами он перешёл бы порог в 8 КБ на лист, который Angular по умолчанию ставит
|
|
8
|
+
приложению, и сборка потребителя упала бы. Лист подключается вторым, после основного. */
|
|
9
|
+
.rt-select {
|
|
10
|
+
/* Подпись на рамке — как у поля ввода. Лежит поверх кнопки и в поток не входит, поэтому
|
|
11
|
+
высота поля от неё не меняется. Пока ничего не выбрано и список закрыт, стоит на месте
|
|
12
|
+
подсказки; при выбранном значении или открытом списке поднимается на верхнюю рамку. Клик
|
|
13
|
+
проходит сквозь подпись в кнопку. */
|
|
14
|
+
&--with-icon-left {
|
|
15
|
+
--rt-select-floating-label-rest-start: calc(
|
|
16
|
+
var(--rt-select-floating-label-start) + var(--rt-input-icon-size) + var(--rt-space-sm)
|
|
17
|
+
);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/* Обведённое поле материального набора прозрачное, и подпись на рамке подложки не имеет:
|
|
21
|
+
рамка под ней разорвана, как у поля Material. `:where` держит силу правила на уровне вида,
|
|
22
|
+
и залитый вид ниже его перекрывает. */
|
|
23
|
+
&#{$preset-weak} {
|
|
24
|
+
--rt-select-floating-label-bg: transparent;
|
|
25
|
+
|
|
26
|
+
/* Подпись на рамке начинается за скруглением угла: на изгибе верхней рамки нет, и
|
|
27
|
+
подпись легла бы на него без просвета слева. Скругление «таблетки» больше поля —
|
|
28
|
+
берётся половина высоты. */
|
|
29
|
+
--rt-select-floating-label-raised-start: max(
|
|
30
|
+
var(--rt-select-floating-label-start),
|
|
31
|
+
calc(min(var(--rt-select-radius), var(--rt-input-height) / 2) + var(--rt-space-2))
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/* У залитого поля скругление малое, и подпись встаёт у начала поля, как прежде. */
|
|
36
|
+
&--appearance--fill {
|
|
37
|
+
--rt-select-floating-label-bg: var(--rt-color-bg-surface-subtle-2);
|
|
38
|
+
--rt-select-floating-label-raised-start: var(--rt-select-floating-label-start);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/* Подпись на рамке рисует только материальный набор: свой вид кита держит поле прежним — с
|
|
42
|
+
подсказкой и без подписи. Имя контролу подпись даёт в обоих видах. */
|
|
43
|
+
&__floating-label {
|
|
44
|
+
position: absolute;
|
|
45
|
+
top: 50%;
|
|
46
|
+
left: var(--rt-select-floating-label-rest-start);
|
|
47
|
+
display: none;
|
|
48
|
+
overflow: hidden;
|
|
49
|
+
max-width: calc(100% - var(--rt-select-floating-label-rest-start) - var(--rt-input-padding-x));
|
|
50
|
+
color: var(--rt-select-floating-label-color);
|
|
51
|
+
font-size: var(--rt-input-font-size);
|
|
52
|
+
line-height: var(--rt-input-line-height);
|
|
53
|
+
pointer-events: none;
|
|
54
|
+
text-overflow: ellipsis;
|
|
55
|
+
transform: translateY(-50%);
|
|
56
|
+
transition:
|
|
57
|
+
top var(--rt-select-floating-label-duration) ease,
|
|
58
|
+
left var(--rt-select-floating-label-duration) ease,
|
|
59
|
+
font-size var(--rt-select-floating-label-duration) ease,
|
|
60
|
+
color var(--rt-select-floating-label-duration) ease;
|
|
61
|
+
white-space: nowrap;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
&#{$preset} &__floating-label {
|
|
65
|
+
display: block;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/* Пока подпись лежит на месте подсказки, подсказка не рисуется: они легли бы друг на друга. */
|
|
69
|
+
&--floating#{$preset}:not(.rt-select--filled, .rt-select--open) &__label--placeholder {
|
|
70
|
+
color: transparent;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
&--filled &__floating-label,
|
|
74
|
+
&--open &__floating-label {
|
|
75
|
+
top: 0;
|
|
76
|
+
left: var(--rt-select-floating-label-raised-start);
|
|
77
|
+
max-width: calc(100% - var(--rt-select-floating-label-raised-start) - var(--rt-select-floating-label-start));
|
|
78
|
+
padding: 0 var(--rt-space-1);
|
|
79
|
+
margin-left: calc(-1 * var(--rt-space-1));
|
|
80
|
+
background-color: var(--rt-select-floating-label-bg);
|
|
81
|
+
font-size: var(--rt-select-floating-label-font-size);
|
|
82
|
+
line-height: 1;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
&--open &__floating-label {
|
|
86
|
+
color: var(--rt-select-floating-label-color-focus);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
&--invalid &__floating-label {
|
|
90
|
+
color: var(--rt-select-floating-label-color-error);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/* Залитое поле материального набора — как поле Material: оно выше, и поднятая подпись
|
|
94
|
+
уменьшается и встаёт внутрь поля над значением, а не на рамку. Пустое поле держит подпись
|
|
95
|
+
на месте подсказки размером со значение. Свой вид кита не меняется. */
|
|
96
|
+
&--floating#{$preset}.rt-select--appearance--fill {
|
|
97
|
+
--rt-input-height: var(--rt-select-fill-floating-height);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/* Подпись в покое — строкой Material, значение — ниже середины, под поднятой подписью:
|
|
101
|
+
при 52 px текст начинается в 22 px от верха строкой в 24 px. */
|
|
102
|
+
&--floating#{$preset}.rt-select--appearance--fill .rt-select__floating-label {
|
|
103
|
+
line-height: var(--rt-leading-tight);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
&--floating#{$preset}.rt-select--appearance--fill .rt-select__label {
|
|
107
|
+
align-self: stretch;
|
|
108
|
+
padding-top: calc(var(--rt-input-height) / 2 - var(--rt-space-1) - var(--rt-input-fill-edge));
|
|
109
|
+
padding-bottom: calc(var(--rt-input-height) / 2 - var(--rt-space-5) - var(--rt-input-border-width));
|
|
110
|
+
line-height: var(--rt-leading-normal);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
&--floating#{$preset}.rt-select--appearance--fill.rt-select--filled .rt-select__floating-label,
|
|
114
|
+
&--floating#{$preset}.rt-select--appearance--fill.rt-select--open .rt-select__floating-label {
|
|
115
|
+
top: calc(var(--rt-input-height) / 2 - var(--rt-space-5));
|
|
116
|
+
left: var(--rt-select-floating-label-rest-start);
|
|
117
|
+
padding: 0;
|
|
118
|
+
margin-left: 0;
|
|
119
|
+
background-color: transparent;
|
|
120
|
+
transform: none;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/* Разрыв рамки под поднятой подписью в материальном наборе. Подпись лежит рядом с кнопкой,
|
|
124
|
+
а не в ней, поэтому разрыв режется прямо в рамке кнопки. У залитого вида рамки сверху нет. */
|
|
125
|
+
&--floating#{$preset}:not(.rt-select--appearance--fill) {
|
|
126
|
+
&.rt-select--filled .rt-select__trigger,
|
|
127
|
+
&.rt-select--open .rt-select__trigger {
|
|
128
|
+
clip-path: polygon(
|
|
129
|
+
0 0,
|
|
130
|
+
var(--rt-select-notch-start) 0,
|
|
131
|
+
var(--rt-select-notch-start) var(--rt-select-notch-depth),
|
|
132
|
+
calc(var(--rt-select-notch-start) + var(--rt-select-notch-width)) var(--rt-select-notch-depth),
|
|
133
|
+
calc(var(--rt-select-notch-start) + var(--rt-select-notch-width)) 0,
|
|
134
|
+
100% 0,
|
|
135
|
+
100% 100%,
|
|
136
|
+
0 100%
|
|
137
|
+
);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/* Фокус залитого поля: в материальном наборе — черта снизу вдвое толще, а не кольцо по
|
|
142
|
+
периметру. Своим видом кита назначения равны общим, и фокус не меняется. */
|
|
143
|
+
&--appearance--fill &__trigger:not(.rt-select__trigger--own):focus {
|
|
144
|
+
box-shadow: var(--rt-input-fill-focus-shadow);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
&--appearance--fill.rt-select--invalid &__trigger:not(.rt-select__trigger--own):focus {
|
|
148
|
+
box-shadow: var(--rt-input-fill-focus-shadow-error);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
&--readonly &__floating-label {
|
|
152
|
+
display: none;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|