@rt-tools/ui-kit 0.6.0 → 0.7.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,6 +1,6 @@
1
1
  {
2
2
  "name": "@rt-tools/ui-kit",
3
- "version": "0.6.0",
3
+ "version": "0.7.0",
4
4
  "license": "Apache-2.0",
5
5
  "author": "Yauheni Krumin",
6
6
  "type": "module",
Binary file
@@ -266,7 +266,12 @@ $side-menu: (
266
266
  // Component-local elevation token for the slide-out sub-menu drawer.
267
267
  --rt-side-menu-sub-content-shadow: 14px 0 28px rgb(0 0 0 / 25%), 10px 0 10px rgb(0 0 0 / 22%);
268
268
 
269
- position: relative;
269
+ // Расположение шторки оставлено за Material: `absolute` с растяжкой по верху и низу, а
270
+ // место под боковую шторку оно освобождает отступом на содержимом контейнера. Стоявший
271
+ // здесь `relative` возвращал шторку в поток, она вставала над содержимым, и контейнер
272
+ // получал вдвое большую высоту прокрутки. Прокручивать его хватало одного
273
+ // `scrollIntoView` на активном пункте подменю: панель уезжала вверх на ширину рельсы и
274
+ // обратно не возвращалась.
270
275
  width: max(var(--rt-side-menu-sub-menu-width), var(--rt-side-menu-sub-menu-dragged-width, 0px));
271
276
  min-width: max(var(--rt-side-menu-sub-menu-width), var(--rt-side-menu-sub-menu-dragged-width, 0px));
272
277
  height: 100%;
@@ -364,8 +369,12 @@ $side-menu: (
364
369
  // справа от значка и четыре у самого префикса. В узкой панели это половина
365
370
  // строки запроса, поэтому зазор сведён к одной ступени. Ручки под него у поля
366
371
  // формы нет: правится сам отступ значка.
372
+ // Слева отступ равен тому, с каким стоит крестик очистки у правого края поля:
373
+ // измерено в витрине, у крестика 9,59 пикселя — своей геометрией кнопки, а не
374
+ // ступенью. Ближайшая ступень — десять; расхождение в 0,41 пикселя глазом не
375
+ // видно, а прежние двенадцать читались как перекос лупы внутрь поля.
367
376
  &::ng-deep .mat-mdc-form-field-icon-prefix > .mat-icon {
368
- padding: 0 var(--rt-spacing-4) 0 var(--rt-spacing-12);
377
+ padding: 0 var(--rt-spacing-4) 0 var(--rt-spacing-10);
369
378
  }
370
379
  }
371
380
 
@@ -42,6 +42,17 @@
42
42
  min-width: min(var(--rt-side-menu-sub-menu-item-width), 100%);
43
43
  }
44
44
 
45
+ // Пункт под подсветкой клавиатуры. Отмечен рамкой, а не заливкой: заливка здесь уже занята
46
+ // активным адресом, и два разных смысла одним видом читались бы как один.
47
+ // Толщина стоит числом: у этого кита набор токенов разводит только цвета рамок, шкалы
48
+ // толщин в нём нет вовсе — взятый оттуда токен приходит пустым, и рамка не рисуется вовсе.
49
+ // Так и вышло: первый кадр показал список без единой отметки.
50
+ &--highlighted {
51
+ border-radius: var(--rt-radius-xl);
52
+ outline: 2px solid var(--rt-border-focus);
53
+ outline-offset: -2px;
54
+ }
55
+
45
56
  .rtui-side-menu-sub-item-title {
46
57
  display: flex;
47
58
  align-items: center;
@@ -109,6 +120,14 @@
109
120
  background-color: var(--mat-list-active-indicator-color);
110
121
  }
111
122
 
123
+ // Отметка подсветки — та же, что у пункта со ссылкой: заголовок папки попадает под
124
+ // ходьбу стрелками наравне с ним.
125
+ &--highlighted {
126
+ border-radius: var(--rt-radius-xl);
127
+ outline: 2px solid var(--rt-border-focus);
128
+ outline-offset: -2px;
129
+ }
130
+
112
131
  &__icon {
113
132
  color: var(--mdc-list-list-item-leading-icon-color);
114
133
  margin-inline: var(--mat-list-list-item-leading-icon-start-space) var(--mat-list-list-item-leading-icon-end-space);
@@ -164,11 +164,18 @@ declare class RtuiScrollableContainerComponent {
164
164
  * Меню, в котором стоит подпункт. Токен вместо самого компонента: подпункт брал его классом, а
165
165
  * меню объявляет подпункт в своих импортах — получался круг «меню → подпункт → меню».
166
166
  *
167
- * Подпункту нужно от меню два значения: какие пункты сейчас раскрыты и что набрано в поиске —
168
- * второе затем, чтобы отметить в подписи то, чем она совпала.
167
+ * Подпункту нужно от меню три значения: какие пункты сейчас отмечены активными, какие папки стоят
168
+ * раскрытыми и что набрано в поиске — последнее затем, чтобы отметить в подписи то, чем она совпала.
169
+ *
170
+ * Активность и раскрытость разошлись, когда поиск научился спускаться внутрь папок: активным
171
+ * остаётся адрес, на котором человек стоит, а раскрытой — всякая папка, в которой нашлось
172
+ * совпадение. Одно значение на двоих раскрывало бы только папку текущего адреса, то есть прятало бы
173
+ * ровно то, что человек искал.
169
174
  */
170
175
  interface IRtuiSideMenuHost {
171
176
  readonly activeMenuIds: Signal<Array<string | number>>;
177
+ readonly expandedMenuIds: Signal<Array<string | number>>;
178
+ readonly highlightedMenuId: Signal<string | number | null>;
172
179
  readonly subMenuQuery: Signal<string>;
173
180
  }
174
181
  declare const RTUI_SIDE_MENU: InjectionToken<IRtuiSideMenuHost>;
@@ -266,11 +273,9 @@ declare class RtuiSideMenuFooterDirective {
266
273
  declare class RtuiSideMenuComponent {
267
274
  #private;
268
275
  /**
269
- * Ширина подменю в оформлении. Своего выбора нет — переменная не ставится вовсе, и ширину
270
- * берёт набор токенов: своё число здесь подменило бы его молча.
271
- */
272
- /**
273
- * Натянутая ширина панели. Кладётся своим свойством, а не тем, каким ширину задаёт
276
+ * Натянутая ширина панели. Своего выбора нет — переменная не ставится вовсе, и ширину берёт
277
+ * набор токенов: своё число здесь подменило бы его молча.
278
+ * Кладётся своим свойством, а не тем, каким ширину задаёт
274
279
  * потребитель: панель берёт наибольшее из двух, и заданная оформлением ширина остаётся нижним
275
280
  * пределом сама по себе. Числом в ките этот предел назвать нечем — ширину знает потребитель.
276
281
  */
@@ -297,6 +302,18 @@ declare class RtuiSideMenuComponent {
297
302
  protected readonly subMenuOpened: Signal<boolean>;
298
303
  /** Что видно в подменю: отобранные пункты того набора, который его сейчас наполняет. */
299
304
  protected readonly visibleSubMenuItems: Signal<ISideMenu.Item[]>;
305
+ /**
306
+ * Какие папки подменю стоят раскрытыми. Публично: подпункт берёт раскрытость отсюда — своей у
307
+ * него нет, а его собственная разметка вложена в него же на любую глубину.
308
+ *
309
+ * Пустой запрос отдаёт прежнюю раскрытость, ту, что была до набора: раскрытым остаётся только
310
+ * раздел текущего адреса. Непустой добавляет к ней все папки, в которых нашлось совпадение, —
311
+ * иначе результат поиска лежит за закрытым заголовком и человеку нужно нажать ещё раз, чтобы
312
+ * увидеть то, что он уже нашёл.
313
+ */
314
+ readonly expandedMenuIds: Signal<Array<string | number>>;
315
+ /** Пункт под подсветкой клавиатуры. Публично: отмечает его подпункт, своего состояния у него нет. */
316
+ readonly highlightedMenuId: Signal<string | number | null>;
300
317
  readonly headerTpl: Signal<TNullable<TemplateRef<Type<unknown>>>>;
301
318
  readonly footerTpl: Signal<TNullable<TemplateRef<Type<unknown>>>>;
302
319
  /** Что набрано в поиске. Публично: подпункт берёт запрос отсюда, чтобы отметить совпавшее. */
@@ -358,6 +375,12 @@ declare class RtuiSideMenuComponent {
358
375
  */
359
376
  onResizeStart(event: MouseEvent): void;
360
377
  onSubMenuSearch(query: string): void;
378
+ /**
379
+ * Нажата клавиша в поле поиска. Поле фокуса не теряет и раздаёт клавиши списку: иначе набор
380
+ * запроса прерывался бы на первой же стрелке. Умолчание отменяется только у съеденной клавиши —
381
+ * буквы уходят полю нетронутыми.
382
+ */
383
+ onSearchKeydown(event: KeyboardEvent): void;
361
384
  closeMobileMenu(): void;
362
385
  clickSubMenuAdditional({ data, event }: {
363
386
  data: ISideMenu.ItemData;
@@ -579,10 +602,22 @@ declare namespace IRtUiConfig {
579
602
  */
580
603
  appearance?: MatFormFieldAppearance;
581
604
  }
605
+ /** Per-instance-overridable defaults for the aside curtain. */
606
+ interface Aside {
607
+ /**
608
+ * Whether Esc closes an open curtain.
609
+ *
610
+ * The kit default is `false`: the key is pressed to lift a hint or to leave a field, and
611
+ * the whole panel closed together with what was entered. An application that needs the
612
+ * former behaviour names it here once instead of naming it at every call.
613
+ */
614
+ closeOnEscape?: boolean;
615
+ }
582
616
  /** Component-level settings. Each entry overrides `global` for that component only. */
583
617
  interface Components {
584
618
  button?: Button;
585
619
  dynamicSelectors?: DynamicSelectors;
620
+ aside?: Aside;
586
621
  }
587
622
  interface Config {
588
623
  global?: Global;
Binary file