@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/package.json CHANGED
@@ -1,18 +1,18 @@
1
1
  {
2
2
  "name": "@rt-tools/ui-kit",
3
- "version": "0.5.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.3.1",
10
- "@rt-tools/store": "^0.3.1",
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.3.1",
15
- "@rt-tools/store": "^0.3.1",
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-base-width) + var(--rt-side-menu-sub-menu-shown-width) - 0.25rem);
210
- width: 0.25rem;
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
- &:hover {
215
- background-color: var(--rt-border-neutral-default);
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: var(--rt-side-menu-sub-menu-shown-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
- /** Material elements appearance */
1514
- appearance: InputSignal<MatFormFieldAppearance>;
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
- /** Material elements appearance */
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