@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
|
@@ -10,14 +10,15 @@
|
|
|
10
10
|
</rt-expansion-panel>
|
|
11
11
|
```
|
|
12
12
|
|
|
13
|
-
| вход
|
|
14
|
-
|
|
|
15
|
-
| `expanded`
|
|
16
|
-
| `disabled`
|
|
17
|
-
| `hideToggle`
|
|
18
|
-
| `appearance`
|
|
19
|
-
| `headerId`
|
|
20
|
-
| `ariaLabel`
|
|
13
|
+
| вход | тип | умолчание |
|
|
14
|
+
| ----------------- | ------------------------------ | --------- |
|
|
15
|
+
| `expanded` | `boolean` (model) | `false` |
|
|
16
|
+
| `disabled` | `boolean` | `false` |
|
|
17
|
+
| `hideToggle` | `boolean` | `false` |
|
|
18
|
+
| `appearance` | `IRtExpansionPanel.Appearance` | `'card'` |
|
|
19
|
+
| `headerId` | `string \| null` | `null` |
|
|
20
|
+
| `ariaLabel` | `string \| null` | `null` |
|
|
21
|
+
| `preserveContent` | `boolean` | `false` |
|
|
21
22
|
|
|
22
23
|
Выход — `expandedChange`, половина двусторонней привязки.
|
|
23
24
|
|
|
@@ -35,11 +36,34 @@
|
|
|
35
36
|
`interpolate-size`, уход доигрывает класс `rt-expansion-panel__body--leaving` через `animate.leave`.
|
|
36
37
|
Браузер без `interpolate-size` показывает тело сразу.
|
|
37
38
|
|
|
39
|
+
**Действия заголовка — узел с `rtExpansionPanelActions`.** Он стоит в строке заголовка вне кнопки,
|
|
40
|
+
и нажатие по нему панель не раскрывает. Шеврон тогда выходит из кнопки и встаёт после действий.
|
|
41
|
+
|
|
42
|
+
**Группа — `rtExpansionPanelGroup` на обёртке.** Раскрытие панели сворачивает остальные панели
|
|
43
|
+
обёртки, и вложенные в обёртки владельца тоже; `multi` это отключает. Панель встаёт в группу сама,
|
|
44
|
+
по токену `RT_EXPANSION_PANEL_GROUP`, и закрывает токен для своего тела: панель в теле панели в
|
|
45
|
+
группу не входит. Действия заголовка и ленивое тело ищутся на любой глубине, в обёртке владельца
|
|
46
|
+
тоже, но берутся только свои: директива запоминает ближайшую панель по `RT_EXPANSION_PANEL_OWNER`,
|
|
47
|
+
и шаблон вложенной панели остаётся ей.
|
|
48
|
+
|
|
49
|
+
**`preserveContent` прячет свёрнутое тело, а не убирает.** Тело получает модификатор `--collapsed`
|
|
50
|
+
и `inert`, высота уходит в ноль. Ленивое тело создаётся при первом раскрытии.
|
|
51
|
+
|
|
38
52
|
## Края
|
|
39
53
|
|
|
40
54
|
- Размеры заголовка и тела — свойства `--rt-expansion-panel-*`. Владелец переназначает их правилом
|
|
41
55
|
двух классов на хосте: одного класса мало, он равен по силе объявлению самой панели на том же
|
|
42
56
|
узле. Вложенная панель объявляет свои значения заново и чужих не наследует.
|
|
57
|
+
- Высоту строки и размер шрифта тела задают `--rt-expansion-panel-body-line-height` и
|
|
58
|
+
`--rt-expansion-panel-body-font-size`. Панель их не объявляет: пока набор оформления их не дал,
|
|
59
|
+
тело наследует оба значения, как прежде. Поэтому их можно задать и на предке, а не только на хосте.
|
|
60
|
+
- `--rt-expansion-panel-box-sizing` (по умолчанию `border-box`) задаёт box-sizing самой панели.
|
|
61
|
+
С `content-box` хост шириной во весь контейнер вылезает за него на ширину своей рамки, если
|
|
62
|
+
приложение её дало.
|
|
63
|
+
- `--rt-expansion-panel-body-box-sizing` задаёт box-sizing тела. Панель его не объявляет, и тело
|
|
64
|
+
наследует значение от хоста. Потомкам тела оно достаётся, только если сброс стилей приложения
|
|
65
|
+
наследует box-sizing: так набор Material даёт телу `content-box`, кружок радио со своей рамкой
|
|
66
|
+
снова занимает 20 px, а хост остаётся во всю ширину контейнера.
|
|
43
67
|
- `headerId` нужен владельцу, который нажимает заголовок по своему номеру: боковое меню ищет строки
|
|
44
68
|
по id.
|
|
45
69
|
- Id тела берётся из счётчика на экземпляр: две панели на странице не ссылаются на чужое тело.
|
|
@@ -24,10 +24,12 @@
|
|
|
24
24
|
--rt-expansion-panel-chevron-color: var(--rt-color-text-muted);
|
|
25
25
|
--rt-expansion-panel-body-padding-inline: var(--rt-space-lg);
|
|
26
26
|
--rt-expansion-panel-body-padding-end: var(--rt-space-md);
|
|
27
|
+
--rt-expansion-panel-actions-gap: var(--rt-space-xs);
|
|
28
|
+
--rt-expansion-panel-box-sizing: border-box;
|
|
27
29
|
|
|
28
30
|
display: block;
|
|
29
31
|
width: 100%;
|
|
30
|
-
box-sizing:
|
|
32
|
+
box-sizing: var(--rt-expansion-panel-box-sizing);
|
|
31
33
|
border-radius: var(--rt-expansion-panel-radius);
|
|
32
34
|
background: var(--rt-expansion-panel-bg);
|
|
33
35
|
box-shadow: var(--rt-expansion-panel-shadow);
|
|
@@ -47,6 +49,43 @@
|
|
|
47
49
|
--rt-expansion-panel-body-padding-end: var(--rt-space-0);
|
|
48
50
|
}
|
|
49
51
|
|
|
52
|
+
/* Строка заголовка. Без действий в ней одна кнопка, и строка ничего не рисует сама. */
|
|
53
|
+
&__head {
|
|
54
|
+
display: flex;
|
|
55
|
+
align-items: center;
|
|
56
|
+
border-radius: var(--rt-expansion-panel-header-radius);
|
|
57
|
+
transition: background-color var(--rt-expansion-panel-duration) ease;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/* С действиями подложку наведения рисует вся строка: действия и шеврон — части заголовка.
|
|
61
|
+
Кнопка уступает им край строки, и её правый отступ переходит к строке. */
|
|
62
|
+
&--with-actions &__head {
|
|
63
|
+
background: var(--rt-expansion-panel-header-bg);
|
|
64
|
+
gap: var(--rt-expansion-panel-header-gap);
|
|
65
|
+
padding-inline-end: var(--rt-expansion-panel-header-padding-end);
|
|
66
|
+
|
|
67
|
+
&:hover {
|
|
68
|
+
background: var(--rt-expansion-panel-header-hover-bg);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
&--with-actions &__header {
|
|
73
|
+
min-width: 0;
|
|
74
|
+
flex: 1 1 auto;
|
|
75
|
+
padding-inline-end: var(--rt-space-0);
|
|
76
|
+
|
|
77
|
+
&:hover:not(:disabled) {
|
|
78
|
+
background: transparent;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
&__actions {
|
|
83
|
+
display: inline-flex;
|
|
84
|
+
flex-shrink: 0;
|
|
85
|
+
align-items: center;
|
|
86
|
+
gap: var(--rt-expansion-panel-actions-gap);
|
|
87
|
+
}
|
|
88
|
+
|
|
50
89
|
/* Заголовок во всю ширину: нажатие принимает вся строка, а не один шеврон. */
|
|
51
90
|
&__header {
|
|
52
91
|
display: flex;
|
|
@@ -97,15 +136,29 @@
|
|
|
97
136
|
&--open {
|
|
98
137
|
transform: rotate(180deg);
|
|
99
138
|
}
|
|
139
|
+
|
|
140
|
+
/* Шеврон после действий стоит вне кнопки и нажимается сам. */
|
|
141
|
+
&--outside {
|
|
142
|
+
cursor: pointer;
|
|
143
|
+
margin-inline-start: 0;
|
|
144
|
+
}
|
|
100
145
|
}
|
|
101
146
|
|
|
102
147
|
/* Раскрытие и сворачивание — высотой от нуля до своей и обратно. Высота «auto» становится
|
|
103
148
|
величиной, между которой можно вести движение, через `interpolate-size`; браузер без него
|
|
104
|
-
показывает и убирает тело сразу.
|
|
149
|
+
показывает и убирает тело сразу.
|
|
150
|
+
Высота строки и размер шрифта тела объявлены без значения по умолчанию: оба наследуются,
|
|
151
|
+
и необъявленное свойство оставляет телу наследованное, как было. Набор оформления даёт
|
|
152
|
+
свои, когда строкам внутри нужна высота строки образца. box-sizing тела тоже не объявлен
|
|
153
|
+
и по умолчанию наследуется от хоста: набор даёт телу content-box, не трогая хост с его
|
|
154
|
+
шириной во весь контейнер. */
|
|
105
155
|
&__body {
|
|
106
156
|
overflow: hidden;
|
|
107
157
|
height: auto;
|
|
158
|
+
box-sizing: var(--rt-expansion-panel-body-box-sizing, inherit);
|
|
159
|
+
font-size: var(--rt-expansion-panel-body-font-size);
|
|
108
160
|
interpolate-size: allow-keywords;
|
|
161
|
+
line-height: var(--rt-expansion-panel-body-line-height);
|
|
109
162
|
padding-block-end: var(--rt-expansion-panel-body-padding-end);
|
|
110
163
|
padding-inline: var(--rt-expansion-panel-body-padding-inline);
|
|
111
164
|
transition:
|
|
@@ -122,6 +175,18 @@
|
|
|
122
175
|
padding-block-end: 0;
|
|
123
176
|
}
|
|
124
177
|
|
|
178
|
+
/* Сохранённое тело свёрнутой панели: высота уходит в ноль, содержимое остаётся в разметке
|
|
179
|
+
со своим состоянием. Скрытость убирает его из порядка фокуса и от чтения с экрана. */
|
|
180
|
+
&--collapsed {
|
|
181
|
+
height: 0;
|
|
182
|
+
padding-block-end: 0;
|
|
183
|
+
transition:
|
|
184
|
+
height var(--rt-expansion-panel-duration) ease,
|
|
185
|
+
padding-block-end var(--rt-expansion-panel-duration) ease,
|
|
186
|
+
visibility 0s linear var(--rt-expansion-panel-duration);
|
|
187
|
+
visibility: hidden;
|
|
188
|
+
}
|
|
189
|
+
|
|
125
190
|
@media (prefers-reduced-motion: reduce) {
|
|
126
191
|
transition: none;
|
|
127
192
|
}
|
|
@@ -83,6 +83,49 @@
|
|
|
83
83
|
видимыми — по ним читается, чего ждут.
|
|
84
84
|
- Текст пояснения (`help`) живёт в поповере и до наведения не отрисован.
|
|
85
85
|
|
|
86
|
+
## Плотность материального набора
|
|
87
|
+
|
|
88
|
+
**Высоту поля под набором задают назначения, а не компонент.** Набор ставит
|
|
89
|
+
`--rt-input-height-md` в 56 px и `--rt-input-font-size` в 16 px. Атрибут `data-rt-density`
|
|
90
|
+
(`0` … `-5`) ставит наследуемый шаг `--rt-input-density`, а высоту из шага считает набор на своём
|
|
91
|
+
узле: атрибут на корне доходит и до поля со своим признаком набора. Узел с атрибутом ниже узла с
|
|
92
|
+
набором пересчитывает высоту сам правилами `src/styles/_density.scss`: ссылка вычисляется там, где
|
|
93
|
+
объявлена. Своя высота приложения `--rt-input-height-app` стоит в той же формуле первой и сильнее
|
|
94
|
+
шага.
|
|
95
|
+
Высоты залитых полей (`--rt-field-fill-height`, `--rt-input-fill-floating-height`,
|
|
96
|
+
`--rt-select-fill-floating-height`) ссылаются на ту же среднюю высоту и идут за плотностью.
|
|
97
|
+
Правила плотности стоят вне слоёв: назначения набора тоже вне слоёв, и в слое атрибут на том же
|
|
98
|
+
узле, что признак набора, проигрывал бы им.
|
|
99
|
+
|
|
100
|
+
**Подпись внутрь кладёт только контрол с местом подсказки.** Его признак — `fieldLabelInside` у
|
|
101
|
+
основы полей; поле ставит модификатор `--label-inside`. Ступень `size` контрола становится высотой
|
|
102
|
+
поля, иначе подпись маленького поля легла бы на нижнюю рамку.
|
|
103
|
+
|
|
104
|
+
**Рамку при наведении рисует каждый контрол сам.** Правило стоит только под набором, под `:where`
|
|
105
|
+
— на уровне вида. Свойство цвета у каждого блока своё (`--rt-<блок>-color-border-hover`): общее
|
|
106
|
+
назначение вычислилось бы на корне и перекрасило бы поля с местной рамкой — поиск списка,
|
|
107
|
+
пагинацию.
|
|
108
|
+
|
|
109
|
+
**Признак набора на самом поле действует так же, как на предке.** Правила подписи внутри лежат в
|
|
110
|
+
своём листе `rt-field-label-inside.scss` под одним селектором: `:is()` ловит набор и на предке, и на
|
|
111
|
+
самом поле. Пара селекторов удвоила бы блок, и лист перешёл бы порог в 8 КБ, на котором падает
|
|
112
|
+
сборка приложения.
|
|
113
|
+
|
|
114
|
+
**Залитое поле под набором сверено с полем Material измерением.** Значение стоит в `h/2 − 4` от
|
|
115
|
+
верха строкой 24 px, поднятая подпись — в `h/2 − 20`: при 52 px это 22 и 6. Правила значения поле
|
|
116
|
+
пишет на `.rt-input__field` и `.rt-select__label` внутри себя, для своей подписи контрола — те же
|
|
117
|
+
числа в его листе подписи. Боковая рамка залитого вида — назначение `--rt-input-fill-edge`, черта
|
|
118
|
+
фокуса — `--rt-input-fill-focus-shadow`: своим видом кита они равны общим, и вид не меняется.
|
|
119
|
+
|
|
120
|
+
## Межбуквенный интервал
|
|
121
|
+
|
|
122
|
+
Подпись поля берёт интервал из ручки `--rt-field-label-letter-spacing`, значения полей — из
|
|
123
|
+
`--rt-input-letter-spacing`. Кит их не объявляет. Без них подпись поля и значение выбора наследуют
|
|
124
|
+
интервал от приложения, как раньше, а поле ввода, число и текст держат `normal` браузера.
|
|
125
|
+
|
|
126
|
+
Высота строки подсказки и ошибки своим видом кита наследуется от приложения; свойство
|
|
127
|
+
`--rt-field-messages-line-height` действует только под материальным набором.
|
|
128
|
+
|
|
86
129
|
## Рядом
|
|
87
130
|
|
|
88
131
|
- [`RtFormControlBase`](../form-control/CONTEXT.md) — что именно поле читает у контрола.
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
@layer rt-kit.components {
|
|
2
|
+
/* Подпись внутри поля под материальным набором — отдельный лист стилей компонента. Одним листом с
|
|
3
|
+
остальными правилами он перешёл бы порог в 8 КБ на лист, который Angular по умолчанию ставит
|
|
4
|
+
приложению, и сборка потребителя упала бы. Лист подключается вторым, после основного. */
|
|
5
|
+
|
|
6
|
+
/* Контролы залитого вида: подпись материального набора у них лежит внутри поля, а не на рамке. */
|
|
7
|
+
$filled-controls: '.rt-input--appearance--fill, .rt-input--appearance--pill, .rt-select--appearance--fill, .rt-input-number--appearance--fill, .rt-input-number--appearance--pill, .rt-textarea--appearance--fill';
|
|
8
|
+
|
|
9
|
+
/* Залитые поля ввода, числа и выбора, у которых значение стоит строкой Material под поднятой подписью. */
|
|
10
|
+
$fill-fields: '#{$filled-controls}';
|
|
11
|
+
$fill-values: '.rt-input--appearance--fill .rt-input__field, .rt-input--appearance--pill .rt-input__field, .rt-select--appearance--fill .rt-select__label, .rt-input-number--appearance--fill .rt-input-number__field, .rt-input-number--appearance--pill .rt-input-number__field';
|
|
12
|
+
|
|
13
|
+
/* Верхняя рамка у залитого поля — своя, у «таблетки» — общая. */
|
|
14
|
+
$pill-values: '.rt-input--appearance--pill .rt-input__field, .rt-input-number--appearance--pill .rt-input-number__field';
|
|
15
|
+
|
|
16
|
+
.rt-field {
|
|
17
|
+
/* Материальный набор кладёт подпись внутрь контрола, как поле Material: пустое поле без
|
|
18
|
+
фокуса держит её на месте подсказки, значение или фокус её поднимают. У обведённого поля
|
|
19
|
+
она встаёт на верхнюю рамку, и рамка под ней разорвана; у залитого — внутрь поля над
|
|
20
|
+
значением. Подпись выходит из потока. Поле только для чтения и поле в загрузке рамки ввода
|
|
21
|
+
не имеют — у них подпись остаётся над значением. Обрезка подписи повторяет подпись на
|
|
22
|
+
рамке у самого поля ввода. Внутрь ложится только подпись поля с местом подсказки — ввода,
|
|
23
|
+
текста, числа и выбора: над палитрой, списком и выбором файла она остаётся сверху.
|
|
24
|
+
Признак набора действует и на предке, и на самом поле — одним селектором: пара селекторов
|
|
25
|
+
удвоила бы весь блок в собранном листе, а лист компонента держится под 8 КБ. */
|
|
26
|
+
&--label-inside:is(.rt-preset-material *, [data-preset='material'] *, .rt-preset-material, [data-preset='material']) {
|
|
27
|
+
/* Текст поля Material и подпись над ним стоят в 16 px от внешнего края поля — и у
|
|
28
|
+
обведённого, и у залитого: рамка входит в этот отступ. */
|
|
29
|
+
--rt-field-floating-start: var(--rt-input-padding-x);
|
|
30
|
+
|
|
31
|
+
position: relative;
|
|
32
|
+
isolation: isolate;
|
|
33
|
+
|
|
34
|
+
&:has(.rt-input--with-icon-left) {
|
|
35
|
+
--rt-field-floating-rest-start: calc(var(--rt-field-floating-start) + var(--rt-input-icon-size) + var(--rt-input-gap));
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/* Значок слева стоит в 12 px от края поля и в 4 px от текста, как у поля Material, —
|
|
39
|
+
подпись в покое встаёт туда, где начинается текст. Кнопка-значок стоит там же. */
|
|
40
|
+
&:has(.rt-input--with-icon-left > .rt-input__icon-left) {
|
|
41
|
+
--rt-field-floating-rest-start: calc(var(--rt-space-2) + var(--rt-space-1) + var(--rt-input-icon-size) + var(--rt-space-1));
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/* Отказ и подсказка под полем начинаются от текста поля, вплотную к нему. */
|
|
45
|
+
.rt-field__messages {
|
|
46
|
+
margin-top: calc(-1 * var(--rt-field-gap));
|
|
47
|
+
padding-inline: var(--rt-input-padding-x);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/* Вход `size` у контрола меняет его высоту своей ступенью, а подпись поля считает место
|
|
51
|
+
от высоты поля: ступень контрола становится высотой поля, иначе подпись маленького
|
|
52
|
+
поля легла бы на его нижнюю рамку. */
|
|
53
|
+
&:has(.rt-input--size--sm, .rt-select--size--sm, .rt-input-number--size--sm) {
|
|
54
|
+
--rt-input-height: var(--rt-input-height-sm);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
&:has(.rt-input--size--lg, .rt-select--size--lg, .rt-input-number--size--lg) {
|
|
58
|
+
--rt-input-height: var(--rt-input-height-lg);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.rt-field__label-row {
|
|
62
|
+
position: absolute;
|
|
63
|
+
z-index: var(--rt-field-floating-z);
|
|
64
|
+
top: calc(var(--rt-input-height) / 2);
|
|
65
|
+
left: var(--rt-field-floating-rest-start);
|
|
66
|
+
max-width: calc(100% - 2 * var(--rt-field-floating-start));
|
|
67
|
+
pointer-events: none;
|
|
68
|
+
transform: translateY(-50%);
|
|
69
|
+
transition:
|
|
70
|
+
top var(--rt-field-floating-duration) ease,
|
|
71
|
+
left var(--rt-field-floating-duration) ease;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
.rt-field__label {
|
|
75
|
+
overflow: hidden;
|
|
76
|
+
color: var(--rt-input-color-text-placeholder);
|
|
77
|
+
font-size: var(--rt-input-font-size);
|
|
78
|
+
font-weight: inherit;
|
|
79
|
+
text-overflow: ellipsis;
|
|
80
|
+
transition:
|
|
81
|
+
font-size var(--rt-field-floating-duration) ease,
|
|
82
|
+
color var(--rt-field-floating-duration) ease;
|
|
83
|
+
white-space: nowrap;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/* Кнопка справки остаётся нажимаемой и в подписи, лежащей поверх поля. */
|
|
87
|
+
.rt-field__help {
|
|
88
|
+
pointer-events: auto;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/* Пока подпись лежит на месте подсказки, подсказка контрола не рисуется; у поля без
|
|
92
|
+
подписи подсказка видна. */
|
|
93
|
+
&:has(.rt-field__label-row):not(.rt-field--filled, :focus-within) {
|
|
94
|
+
::placeholder,
|
|
95
|
+
.rt-select__label--placeholder {
|
|
96
|
+
color: transparent;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
&.rt-field--filled .rt-field__label-row,
|
|
101
|
+
&:focus-within .rt-field__label-row {
|
|
102
|
+
top: 0;
|
|
103
|
+
left: var(--rt-field-raised-start);
|
|
104
|
+
max-width: calc(100% - var(--rt-field-raised-start) - var(--rt-field-floating-start));
|
|
105
|
+
padding: 0 var(--rt-space-1);
|
|
106
|
+
margin-left: calc(-1 * var(--rt-space-1));
|
|
107
|
+
line-height: 1;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/* Разрыв рамки под поднятой подписью: зона контрола вырезает у себя полосу толщиной в
|
|
111
|
+
рамку фокуса шириной в подпись. Поле в наборе прозрачное, поэтому вырезается только
|
|
112
|
+
рамка, а под ней виден тот же фон, что вокруг поля. */
|
|
113
|
+
&.rt-field--filled:not(:has(#{$filled-controls})) .rt-field__control,
|
|
114
|
+
&:focus-within:not(:has(#{$filled-controls})) .rt-field__control {
|
|
115
|
+
clip-path: polygon(
|
|
116
|
+
0 0,
|
|
117
|
+
var(--rt-field-notch-start) 0,
|
|
118
|
+
var(--rt-field-notch-start) var(--rt-field-notch-depth),
|
|
119
|
+
calc(var(--rt-field-notch-start) + var(--rt-field-notch-width)) var(--rt-field-notch-depth),
|
|
120
|
+
calc(var(--rt-field-notch-start) + var(--rt-field-notch-width)) 0,
|
|
121
|
+
100% 0,
|
|
122
|
+
100% 100%,
|
|
123
|
+
0 100%
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/* Залитое поле Material выше обведённого, и поднятая подпись лежит внутри него, над
|
|
128
|
+
значением: рамки сверху у залитого поля нет. */
|
|
129
|
+
&:has(#{$filled-controls}) {
|
|
130
|
+
--rt-input-height: var(--rt-field-fill-height);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/* Подпись в покое — строкой Material; значение — ниже середины, под поднятой подписью:
|
|
134
|
+
при 52 px текст начинается в 22 px от верха строкой в 24 px. Поле без подписи места под
|
|
135
|
+
неё не держит, и значение стоит посередине, как у поля Material без mat-label. */
|
|
136
|
+
&:has(#{$fill-fields}) .rt-field__label {
|
|
137
|
+
line-height: var(--rt-leading-tight);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
&:has(.rt-field__label-row) :is(#{$fill-values}) {
|
|
141
|
+
align-self: stretch;
|
|
142
|
+
padding-top: calc(var(--rt-input-height) / 2 - var(--rt-space-1) - var(--rt-input-fill-edge));
|
|
143
|
+
padding-bottom: calc(var(--rt-input-height) / 2 - var(--rt-space-5) - var(--rt-input-border-width));
|
|
144
|
+
line-height: var(--rt-leading-normal);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
&:has(.rt-field__label-row) :is(#{$pill-values}) {
|
|
148
|
+
padding-top: calc(var(--rt-input-height) / 2 - var(--rt-space-1) - var(--rt-input-border-width));
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
&.rt-field--filled:has(#{$filled-controls}) .rt-field__label-row,
|
|
152
|
+
&:focus-within:has(#{$filled-controls}) .rt-field__label-row {
|
|
153
|
+
top: calc(var(--rt-input-height) / 2 - var(--rt-space-5));
|
|
154
|
+
left: var(--rt-field-floating-rest-start);
|
|
155
|
+
padding: 0;
|
|
156
|
+
margin-left: 0;
|
|
157
|
+
transform: none;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
&.rt-field--filled .rt-field__label,
|
|
161
|
+
&:focus-within .rt-field__label {
|
|
162
|
+
font-size: var(--rt-text-xs);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
&:focus-within .rt-field__label {
|
|
166
|
+
color: var(--rt-input-color-border-focus);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
&.rt-field--invalid .rt-field__label {
|
|
170
|
+
color: var(--rt-input-color-border-error);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/* Подпись отключённого поля — цвета отключённого текста, как у поля Material. */
|
|
174
|
+
&:has(.rt-input--disabled, .rt-select--disabled, .rt-input-number--disabled, .rt-textarea--disabled) .rt-field__label {
|
|
175
|
+
color: var(--rt-input-color-placeholder-disabled);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
@@ -1,5 +1,28 @@
|
|
|
1
1
|
@layer rt-kit.components {
|
|
2
2
|
.rt-field {
|
|
3
|
+
--rt-field-floating-start: calc(var(--rt-input-padding-x) + var(--rt-input-border-width));
|
|
4
|
+
--rt-field-floating-rest-start: var(--rt-field-floating-start);
|
|
5
|
+
--rt-field-floating-duration: var(--rt-duration-fast);
|
|
6
|
+
|
|
7
|
+
/* Поднятая подпись начинается за скруглением угла: на изгибе верхней рамки ещё нет, и
|
|
8
|
+
разрыв там не виден — подпись легла бы на изгиб без просвета слева. */
|
|
9
|
+
--rt-field-raised-start: max(
|
|
10
|
+
var(--rt-field-floating-start),
|
|
11
|
+
calc(min(var(--rt-input-radius), var(--rt-input-height) / 2) + var(--rt-space-2))
|
|
12
|
+
);
|
|
13
|
+
--rt-field-notch-start: calc(var(--rt-field-raised-start) - var(--rt-space-1));
|
|
14
|
+
--rt-field-notch-depth: calc(2 * var(--rt-input-border-width));
|
|
15
|
+
|
|
16
|
+
/* Ширину подписи на рамке ставит компонент замером; до замера разрыва нет. */
|
|
17
|
+
--rt-field-notch-width: 0px;
|
|
18
|
+
|
|
19
|
+
/* Высота залитого поля Material: подпись лежит внутри поля над значением. Она равна средней
|
|
20
|
+
высоте поля — под набором это высота Material при выбранной плотности. */
|
|
21
|
+
--rt-field-fill-height: var(--rt-input-height-md);
|
|
22
|
+
|
|
23
|
+
/* Ярус подписи над контролом — внутри поля: `isolation` не пускает её над страницей. */
|
|
24
|
+
--rt-field-floating-z: var(--rt-z-sticky);
|
|
25
|
+
|
|
3
26
|
display: flex;
|
|
4
27
|
flex-direction: column;
|
|
5
28
|
gap: var(--rt-field-gap);
|
|
@@ -14,12 +37,23 @@
|
|
|
14
37
|
color: var(--rt-field-label-color);
|
|
15
38
|
font-size: var(--rt-field-label-font-size);
|
|
16
39
|
font-weight: var(--rt-field-label-font-weight);
|
|
40
|
+
|
|
41
|
+
/* Межбуквенный интервал подписи — ручка приложения: кит её не объявляет, без неё интервал
|
|
42
|
+
наследуется от приложения, как раньше. */
|
|
43
|
+
letter-spacing: var(--rt-field-label-letter-spacing, inherit);
|
|
17
44
|
}
|
|
18
45
|
|
|
19
46
|
&__required {
|
|
47
|
+
margin-left: var(--rt-field-required-gap);
|
|
20
48
|
color: var(--rt-field-required-color);
|
|
21
49
|
}
|
|
22
50
|
|
|
51
|
+
/* Недействительное поле красит звёздочку цветом ошибки. Своим видом кита она красная и так;
|
|
52
|
+
материальный набор красит её цветом подписи и до ошибки. */
|
|
53
|
+
&--invalid &__required {
|
|
54
|
+
color: var(--rt-field-error-color);
|
|
55
|
+
}
|
|
56
|
+
|
|
23
57
|
/* Зона значения: проецируемый контрол или read-only текст. Задаёт размер/цвет
|
|
24
58
|
значения, чтобы оно было крупнее и контрастнее muted-лейбла. Нативные
|
|
25
59
|
<input> у rt-контролов задают свой font-size сами и это не переопределяют —
|
|
@@ -47,13 +81,28 @@
|
|
|
47
81
|
/* Зона сообщений под контролом. С резервом (reserveHintSpace) hint и ошибка
|
|
48
82
|
кладутся в одну ячейку грида: скрытый hint продолжает задавать высоту, и
|
|
49
83
|
подмена сообщения не двигает форму ни вниз, ни вверх. Без hint высоту
|
|
50
|
-
держит min-height в одну строку — считаем по error-шрифту, он крупнее.
|
|
84
|
+
держит min-height в одну строку — считаем по error-шрифту, он крупнее.
|
|
85
|
+
Под набором это строка подсказки Material: своя высота строки и отступ над ней. Отступ
|
|
86
|
+
есть, только когда строке есть что держать: резерв или сообщение. Своим видом кита
|
|
87
|
+
строка прежняя. Строка считается в `border-box`, и отступ входит в её наименьшую высоту: так
|
|
88
|
+
она та же и у приложения, которое ставит `border-box` всем узлам своим правилом вне слоёв. */
|
|
51
89
|
&__messages {
|
|
52
90
|
display: grid;
|
|
91
|
+
box-sizing: border-box;
|
|
92
|
+
|
|
93
|
+
/* Своим видом высота строки наследуется от приложения, как раньше: правило стоит только под набором. */
|
|
94
|
+
&:is(.rt-preset-material *, [data-preset='material'] *) {
|
|
95
|
+
line-height: var(--rt-field-messages-line-height);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
&--reserved,
|
|
99
|
+
&:has(> *) {
|
|
100
|
+
padding-top: var(--rt-field-messages-padding-top);
|
|
101
|
+
}
|
|
53
102
|
|
|
54
103
|
&--reserved {
|
|
55
104
|
font-size: var(--rt-field-error-font-size);
|
|
56
|
-
min-block-size: 1lh;
|
|
105
|
+
min-block-size: calc(1lh + var(--rt-field-messages-padding-top));
|
|
57
106
|
|
|
58
107
|
> * {
|
|
59
108
|
grid-area: 1 / 1;
|
|
@@ -4,21 +4,21 @@
|
|
|
4
4
|
<rt-icon-button icon="ico-trash" ariaLabel="Удалить" variant="danger" size="md" (clicked)="remove()" />
|
|
5
5
|
```
|
|
6
6
|
|
|
7
|
-
| вход | тип | умолчание
|
|
8
|
-
| ----------------------------------------------- | ----------------------------------------------------------------------------- |
|
|
9
|
-
| `icon` | `IRtIcon.Name \| null` — нужен он или `glyph`; без обоих показывает вложенное | `null`
|
|
10
|
-
| `glyph` | `string \| null` — имя Material, как `glyph` у `rt-icon` | `null`
|
|
11
|
-
| `ariaLabel` | `string` | **обязателен**
|
|
12
|
-
| `variant` | `'primary' \| 'secondary' \| 'ghost' \| 'danger' \| 'success' \| 'warning'` | `'ghost'`
|
|
13
|
-
| `size` | `'2xs' \| 'xs' \| 'sm' \| 'md' \| 'lg' \| 'xl' \| '2xl'` | `'md'`
|
|
14
|
-
| `iconSize` | `IRtIcon.Size \| null` | `null` → от размера кнопки
|
|
15
|
-
| `iconColor` | `IRtIcon.Color` | `'current'`
|
|
16
|
-
| `radius` | `TRtRadius \| null` — шаг общей шкалы | `null` → `md`
|
|
17
|
-
| `type` | `'button' \| 'submit'` | `'button'`
|
|
18
|
-
| `tooltip` | `string` | `''` (пусто → подсказки нет)
|
|
19
|
-
| `tooltipHideOnClick` | `boolean` — `false` у переключателя: подсказка остаётся после клика | `true`
|
|
20
|
-
| `tabIndex` | `number` | `0`
|
|
21
|
-
| `loading` / `disabled` / `active` / `indicator` | `boolean` | `false`
|
|
7
|
+
| вход | тип | умолчание |
|
|
8
|
+
| ----------------------------------------------- | ----------------------------------------------------------------------------- | ---------------------------------- |
|
|
9
|
+
| `icon` | `IRtIcon.Name \| null` — нужен он или `glyph`; без обоих показывает вложенное | `null` |
|
|
10
|
+
| `glyph` | `string \| null` — имя Material, как `glyph` у `rt-icon` | `null` |
|
|
11
|
+
| `ariaLabel` | `string` | **обязателен** |
|
|
12
|
+
| `variant` | `'primary' \| 'secondary' \| 'ghost' \| 'danger' \| 'success' \| 'warning'` | `'ghost'` |
|
|
13
|
+
| `size` | `'2xs' \| 'xs' \| 'sm' \| 'md' \| 'lg' \| 'xl' \| '2xl'` | `'md'` |
|
|
14
|
+
| `iconSize` | `IRtIcon.Size \| null` | `null` → от размера кнопки |
|
|
15
|
+
| `iconColor` | `IRtIcon.Color` | `'current'` |
|
|
16
|
+
| `radius` | `TRtRadius \| null` — шаг общей шкалы | `null` → `md` |
|
|
17
|
+
| `type` | `'button' \| 'submit'` | `'button'` |
|
|
18
|
+
| `tooltip` | `string` | `''` (пусто → подсказки нет) |
|
|
19
|
+
| `tooltipHideOnClick` | `boolean` — `false` у переключателя: подсказка остаётся после клика | из `provideRtKit`, без него `true` |
|
|
20
|
+
| `tabIndex` | `number` | `0` |
|
|
21
|
+
| `loading` / `disabled` / `active` / `indicator` | `boolean` | `false` |
|
|
22
22
|
|
|
23
23
|
| выход | тип |
|
|
24
24
|
| --------- | ------------ |
|
|
@@ -54,6 +54,8 @@
|
|
|
54
54
|
- `iconSize` нужен, когда крупная кнопка должна остаться крупной (в неё целятся пальцем), а
|
|
55
55
|
иконка во весь диаметр выглядит тяжеловесно.
|
|
56
56
|
- Модификаторы в камелкейсе конвертируются в дефис: `indicator` → `rt-icon-button--has-indicator`.
|
|
57
|
+
- Кольцо фокуса не рисуется при фокусе от мыши и касания, как у `rtButton`: `CdkMonitorFocus` на
|
|
58
|
+
`<button>` внутри ставит классы `cdk-*-focused`, и правило кольца их читает.
|
|
57
59
|
|
|
58
60
|
## Рядом
|
|
59
61
|
|
|
@@ -183,7 +183,9 @@
|
|
|
183
183
|
}
|
|
184
184
|
}
|
|
185
185
|
|
|
186
|
-
|
|
186
|
+
/* Фокус от мыши и касания кольца не рисует, как у Material: браузер ставит `:focus-visible` и
|
|
187
|
+
на фокус из кода после нажатия мышью — окно открылось кликом и перевело фокус на кнопку. */
|
|
188
|
+
&:focus-visible:not(.cdk-mouse-focused, .cdk-touch-focused) {
|
|
187
189
|
box-shadow: var(--rt-icon-button-focus-shadow);
|
|
188
190
|
outline: 2px solid transparent;
|
|
189
191
|
outline-offset: 2px;
|
|
@@ -59,10 +59,10 @@
|
|
|
59
59
|
|
|
60
60
|
/* Плашка-поле приложения: светлая подложка, рамка, текст и значок — основной цвет темы. */
|
|
61
61
|
--rt-inline-edit-chip-field-bg: var(--rt-mat-neutral-5);
|
|
62
|
-
--rt-inline-edit-chip-field-color: var(--
|
|
63
|
-
--rt-inline-edit-chip-field-icon-color: var(--
|
|
64
|
-
--rt-inline-edit-chip-field-border-color: var(--
|
|
65
|
-
--rt-inline-edit-chip-field-border-color-focus: var(--
|
|
62
|
+
--rt-inline-edit-chip-field-color: var(--rt-sys-primary, var(--rt-color-action-primary));
|
|
63
|
+
--rt-inline-edit-chip-field-icon-color: var(--rt-sys-primary, var(--rt-color-action-primary));
|
|
64
|
+
--rt-inline-edit-chip-field-border-color: var(--rt-sys-primary-fixed-dim, var(--rt-brand-200));
|
|
65
|
+
--rt-inline-edit-chip-field-border-color-focus: var(--rt-sys-primary, var(--rt-color-action-primary));
|
|
66
66
|
}
|
|
67
67
|
|
|
68
68
|
/* Значение в покое: подпись режется многоточием, полный текст — в подсказке. */
|