@rt-tools/ui-kit 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/rt-tools-ui-kit.mjs +105 -17
- package/fesm2022/rt-tools-ui-kit.mjs.map +1 -1
- package/package.json +5 -5
- package/rt-tools-ui-kit-0.6.0.tgz +0 -0
- package/src/lib/ui-kit/side-menu/menu/rtui-side-menu.component.scss +46 -5
- package/types/rt-tools-ui-kit.d.ts +36 -4
- package/rt-tools-ui-kit-0.5.0.tgz +0 -0
package/package.json
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rt-tools/ui-kit",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"author": "Yauheni Krumin",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"dependencies": {
|
|
8
8
|
"tslib": "^2.8.0",
|
|
9
|
-
"@rt-tools/core": "^0.
|
|
10
|
-
"@rt-tools/store": "^0.3.
|
|
9
|
+
"@rt-tools/core": "^0.5.0",
|
|
10
|
+
"@rt-tools/store": "^0.3.2",
|
|
11
11
|
"@rt-tools/utils": "^0.4.0"
|
|
12
12
|
},
|
|
13
13
|
"peerDependencies": {
|
|
14
|
-
"@rt-tools/core": "^0.
|
|
15
|
-
"@rt-tools/store": "^0.3.
|
|
14
|
+
"@rt-tools/core": "^0.5.0",
|
|
15
|
+
"@rt-tools/store": "^0.3.2",
|
|
16
16
|
"@rt-tools/utils": "^0.4.0",
|
|
17
17
|
"@angular/cdk": "^22.0.0",
|
|
18
18
|
"@angular/common": "^22.0.0",
|
|
Binary file
|
|
@@ -46,6 +46,15 @@ $side-menu: (
|
|
|
46
46
|
track-color: var(--rt-bg-base-strong),
|
|
47
47
|
thumb-color: var(--rt-bg-base-emphasis-soft),
|
|
48
48
|
),
|
|
49
|
+
// Ручка тяги: видимая полоса и зона, которой она захватывается курсором, — два разных числа.
|
|
50
|
+
// Пока они были одним, попасть в четыре пикселя удавалось не с первого раза, а промах мимо
|
|
51
|
+
// ручки попадает в панель подменю — то есть вместо тяги человек нажимает пункт. Зона шире
|
|
52
|
+
// втрое и стоит по центру прежнего места: видимое от этого не двигается ни на пиксель.
|
|
53
|
+
resizer: (
|
|
54
|
+
width: 0.25rem,
|
|
55
|
+
grab-width: 0.75rem,
|
|
56
|
+
hover-color: var(--rt-border-neutral-default),
|
|
57
|
+
),
|
|
49
58
|
);
|
|
50
59
|
|
|
51
60
|
:host(.rtui-side-menu--pinned) {
|
|
@@ -71,6 +80,10 @@ $side-menu: (
|
|
|
71
80
|
// и выражение, повторённое у каждого, разъезжается на первой же правке одного из них.
|
|
72
81
|
--rt-side-menu-sub-menu-shown-width: max(var(--rt-side-menu-sub-menu-width), var(--rt-side-menu-sub-menu-dragged-width, 0px));
|
|
73
82
|
|
|
83
|
+
// Правый край панели подменю на экране: отступ полосы значков плюс её показанная ширина.
|
|
84
|
+
// Тем же числом стоит ручка тяги, и повторённое у неё выражение разошлось бы с этим.
|
|
85
|
+
--rt-side-menu-panel-edge: calc(var(--rt-side-menu-base-width) + var(--rt-side-menu-sub-menu-shown-width));
|
|
86
|
+
|
|
74
87
|
// Полоса прокрутки обоих списков меню — полосы значков и подменю. Оформляется здесь, а не у
|
|
75
88
|
// прокручиваемой области: вид остальных её экранов от этой правки не двигается. Правило
|
|
76
89
|
// пробивает инкапсуляцию, потому что прокручивается внутренний узел области, а полоса
|
|
@@ -204,15 +217,36 @@ $side-menu: (
|
|
|
204
217
|
// уносит в свою область содержимого. Снаружи ручка идёт от края экрана до края, и стоит она
|
|
205
218
|
// там, где кончается панель: отступ полосы значков плюс ширина самой панели.
|
|
206
219
|
.rtui-side-menu-resizer {
|
|
220
|
+
// Свес — половина лишней ширины, на которую зона захвата шире видимой полосы. Его
|
|
221
|
+
// используют два места: сам узел, сдвинутый влево на эту величину, и полоса внутри него,
|
|
222
|
+
// отступающая на неё же. Выражение, повторённое у обоих, расходится на первой же правке
|
|
223
|
+
// одного.
|
|
224
|
+
--rt-side-menu-resizer-overhang: calc((var(--rt-side-menu-resizer-grab-width) - var(--rt-side-menu-resizer-width)) / 2);
|
|
225
|
+
|
|
226
|
+
// Отступ узла от правого края панели: своя ширина полосы плюс свес слева от неё.
|
|
227
|
+
--rt-side-menu-resizer-inset: calc(var(--rt-side-menu-resizer-width) + var(--rt-side-menu-resizer-overhang));
|
|
228
|
+
|
|
229
|
+
// Узел занимает зону захвата целиком и стоит так, чтобы прежняя полоса осталась на своём
|
|
230
|
+
// месте: лишняя ширина расходится поровну в обе стороны от неё.
|
|
207
231
|
position: fixed;
|
|
208
232
|
z-index: 3;
|
|
209
|
-
left: calc(var(--rt-side-menu-
|
|
210
|
-
width:
|
|
233
|
+
left: calc(var(--rt-side-menu-panel-edge) - var(--rt-side-menu-resizer-inset));
|
|
234
|
+
width: var(--rt-side-menu-resizer-grab-width);
|
|
211
235
|
cursor: col-resize;
|
|
212
236
|
inset-block: 0;
|
|
213
237
|
|
|
214
|
-
|
|
215
|
-
|
|
238
|
+
// Красится не сам узел, а полоса внутри него: закрашенная зона захвата стала бы втрое
|
|
239
|
+
// толще прежней линии и читалась бы другим оформлением, а не тем же с большей мишенью.
|
|
240
|
+
&:before {
|
|
241
|
+
position: absolute;
|
|
242
|
+
left: var(--rt-side-menu-resizer-overhang);
|
|
243
|
+
width: var(--rt-side-menu-resizer-width);
|
|
244
|
+
content: '';
|
|
245
|
+
inset-block: 0;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
&:hover:before {
|
|
249
|
+
background-color: var(--rt-side-menu-resizer-hover-color);
|
|
216
250
|
}
|
|
217
251
|
}
|
|
218
252
|
|
|
@@ -283,10 +317,17 @@ $side-menu: (
|
|
|
283
317
|
&--pinned {
|
|
284
318
|
position: relative;
|
|
285
319
|
left: 0;
|
|
286
|
-
width:
|
|
320
|
+
width: 0;
|
|
287
321
|
height: 100%;
|
|
288
322
|
flex: 0 0 auto;
|
|
289
323
|
|
|
324
|
+
// Ширину закреплённая панель занимает, только пока ей есть что показать. Ширина,
|
|
325
|
+
// поставленная одним лишь закреплением, оставляла пустую полосу слева от страницы на
|
|
326
|
+
// каждом адресе, у которого разделов нет: панели там не видно, а место она держала.
|
|
327
|
+
&.rtui-sub-side-menu--opened {
|
|
328
|
+
width: var(--rt-side-menu-sub-menu-shown-width);
|
|
329
|
+
}
|
|
330
|
+
|
|
290
331
|
.rtui-sub-side-menu-content {
|
|
291
332
|
box-shadow: none;
|
|
292
333
|
|
|
@@ -10,9 +10,9 @@ import { OverlayRef, ComponentType, ConnectedPosition, CdkOverlayOrigin } from '
|
|
|
10
10
|
import { ComponentType as ComponentType$1 } from '@angular/cdk/portal';
|
|
11
11
|
import { BooleanInput, NumberInput } from '@angular/cdk/coercion';
|
|
12
12
|
import { MatButtonAppearance } from '@angular/material/button';
|
|
13
|
+
import { MatFormFieldAppearance } from '@angular/material/form-field';
|
|
13
14
|
import * as i1 from '@angular/material/tooltip';
|
|
14
15
|
import { TooltipPosition } from '@angular/material/tooltip';
|
|
15
|
-
import { MatFormFieldAppearance } from '@angular/material/form-field';
|
|
16
16
|
import { MatSnackBarConfig, MatSnackBarRef } from '@angular/material/snack-bar';
|
|
17
17
|
import { EPosition, OSTypes } from '@rt-tools/core';
|
|
18
18
|
import { CdkDragDrop } from '@angular/cdk/drag-drop';
|
|
@@ -568,9 +568,21 @@ declare namespace IRtUiConfig {
|
|
|
568
568
|
radius?: IRtuiButton.Radius;
|
|
569
569
|
appearance?: IRtuiButton.Appearance;
|
|
570
570
|
}
|
|
571
|
+
/** Per-instance-overridable defaults for the dynamic selectors family. */
|
|
572
|
+
interface DynamicSelectors {
|
|
573
|
+
/**
|
|
574
|
+
* Appearance every form field of the family renders with.
|
|
575
|
+
*
|
|
576
|
+
* The family nests: a selector holds an input, an input opens a popup, a popup holds a
|
|
577
|
+
* list. Set once here, the look reaches all of them; passed as an input, it has to be
|
|
578
|
+
* repeated at every use, and the one that was missed differs from the rest.
|
|
579
|
+
*/
|
|
580
|
+
appearance?: MatFormFieldAppearance;
|
|
581
|
+
}
|
|
571
582
|
/** Component-level settings. Each entry overrides `global` for that component only. */
|
|
572
583
|
interface Components {
|
|
573
584
|
button?: Button;
|
|
585
|
+
dynamicSelectors?: DynamicSelectors;
|
|
574
586
|
}
|
|
575
587
|
interface Config {
|
|
576
588
|
global?: Global;
|
|
@@ -1510,8 +1522,22 @@ declare abstract class RtuiDynamicSelectorsDirective {
|
|
|
1510
1522
|
placeholderIcon: InputSignalWithTransform<string, string>;
|
|
1511
1523
|
/** Placeholder description */
|
|
1512
1524
|
placeholderDescription: InputSignalWithTransform<string, string>;
|
|
1513
|
-
/**
|
|
1514
|
-
|
|
1525
|
+
/**
|
|
1526
|
+
* Material elements appearance.
|
|
1527
|
+
*
|
|
1528
|
+
* Пустота умолчанием, а не прежнее значение: значение, оставленное умолчанием входа, побеждает
|
|
1529
|
+
* настройку всегда — вход задан, и цепочка разрешения на нём кончается, а настройка не
|
|
1530
|
+
* срабатывает ни разу и выглядит сломанной.
|
|
1531
|
+
*/
|
|
1532
|
+
appearance: InputSignal<MatFormFieldAppearance | undefined>;
|
|
1533
|
+
/**
|
|
1534
|
+
* Вид поля, с которым семейство рисуется: вход на месте, потом раздел настройки, потом
|
|
1535
|
+
* умолчание кита.
|
|
1536
|
+
*
|
|
1537
|
+
* Считается один раз здесь, а шаблоны читают готовое: повторённая в каждом из пяти шаблонов
|
|
1538
|
+
* семейства, эта цепочка разъехалась бы с настройкой в первом же месте, куда забыли заглянуть.
|
|
1539
|
+
*/
|
|
1540
|
+
readonly resolvedAppearance: Signal<MatFormFieldAppearance>;
|
|
1515
1541
|
static ɵfac: i0.ɵɵFactoryDeclaration<RtuiDynamicSelectorsDirective, never>;
|
|
1516
1542
|
static ɵdir: i0.ɵɵDirectiveDeclaration<RtuiDynamicSelectorsDirective, never, never, { "buttonTitle": { "alias": "buttonTitle"; "required": false; "isSignal": true; }; "isSingleSelection": { "alias": "isSingleSelection"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "useNameBreaking": { "alias": "useNameBreaking"; "required": false; "isSignal": true; }; "useTitleCase": { "alias": "useTitleCase"; "required": false; "isSignal": true; }; "isPlaceholderIconOutlined": { "alias": "isPlaceholderIconOutlined"; "required": false; "isSignal": true; }; "isDeleteButtonShown": { "alias": "isDeleteButtonShown"; "required": false; "isSignal": true; }; "isListDraggable": { "alias": "isListDraggable"; "required": false; "isSignal": true; }; "placeholderIcon": { "alias": "placeholderIcon"; "required": false; "isSignal": true; }; "placeholderDescription": { "alias": "placeholderDescription"; "required": false; "isSignal": true; }; "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
1517
1543
|
}
|
|
@@ -1854,7 +1880,13 @@ declare class RtuiDynamicSelectorSelectedListComponent<ENTITY extends Record<str
|
|
|
1854
1880
|
isDeleteButtonShown: InputSignalWithTransform<boolean, BooleanInput>;
|
|
1855
1881
|
/** Indicates is items editable */
|
|
1856
1882
|
isItemsEditable: InputSignalWithTransform<boolean, BooleanInput>;
|
|
1857
|
-
/**
|
|
1883
|
+
/**
|
|
1884
|
+
* Material elements appearance.
|
|
1885
|
+
*
|
|
1886
|
+
* Значение приходит уже разрешённым — от того, кто список рисует: вложенный компонент,
|
|
1887
|
+
* разрешающий вид заново, заводит свою цепочку, и вид поля внутри списка отличается от вида
|
|
1888
|
+
* поля под ним. Прежнее умолчание оставлено на случай одиночного употребления списка.
|
|
1889
|
+
*/
|
|
1858
1890
|
appearance: InputSignal<MatFormFieldAppearance>;
|
|
1859
1891
|
readonly deleteFromSelectedAction: OutputEmitterRef<ENTITY[KEY]>;
|
|
1860
1892
|
readonly dropAction: OutputEmitterRef<CdkDragDrop<ENTITY[]>>;
|
|
Binary file
|