@rt-tools/ui-kit 0.6.1 → 0.7.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rt-tools/ui-kit",
3
- "version": "0.6.1",
3
+ "version": "0.7.1",
4
4
  "license": "Apache-2.0",
5
5
  "author": "Yauheni Krumin",
6
6
  "type": "module",
Binary file
@@ -369,8 +369,23 @@ $side-menu: (
369
369
  // справа от значка и четыре у самого префикса. В узкой панели это половина
370
370
  // строки запроса, поэтому зазор сведён к одной ступени. Ручки под него у поля
371
371
  // формы нет: правится сам отступ значка.
372
+ // Слева отступ равен тому, с каким стоит крестик очистки у правого края поля:
373
+ // измерено в витрине, у крестика 9,59 пикселя — своей геометрией кнопки, а не
374
+ // ступенью. Ближайшая ступень — десять; расхождение в 0,41 пикселя глазом не
375
+ // видно, а прежние двенадцать читались как перекос лупы внутрь поля.
376
+ // Отступ отмеряется от края поля, а не от того, что останется после обёртки:
377
+ // боковой отступ обёртки готового поля зависит от набора, который взял кит, и в
378
+ // приложении-потребителе он двенадцать пикселей при нуле в витрине. Правка
379
+ // одного значка сходилась поэтому только здесь, а у потребителя лупа стояла в
380
+ // двадцати двух пикселях против 9,6 у крестика. Обнулено — и отступ значка
381
+ // становится всем отступом лупы, где бы кит ни стоял.
382
+ &::ng-deep .mat-mdc-text-field-wrapper,
383
+ &::ng-deep .mat-mdc-form-field-icon-prefix {
384
+ padding-left: 0;
385
+ }
386
+
372
387
  &::ng-deep .mat-mdc-form-field-icon-prefix > .mat-icon {
373
- padding: 0 var(--rt-spacing-4) 0 var(--rt-spacing-12);
388
+ padding: 0 var(--rt-spacing-4) 0 var(--rt-spacing-10);
374
389
  }
375
390
  }
376
391
 
@@ -392,9 +407,15 @@ $side-menu: (
392
407
  --mat-form-field-container-vertical-padding: var(--rt-spacing-8);
393
408
 
394
409
  // Зазор между значком и запросом сведён к ступени по той же причине, что и на широком
395
- // экране: готовое поле разводит их на шестнадцать пикселей.
410
+ // экране: готовое поле разводит их на шестнадцать пикселей. Отступ слева и обнуление
411
+ // отступа обёртки — те же, что и там: поле одно и то же, и разъезжаться им незачем.
412
+ &::ng-deep .mat-mdc-text-field-wrapper,
413
+ &::ng-deep .mat-mdc-form-field-icon-prefix {
414
+ padding-left: 0;
415
+ }
416
+
396
417
  &::ng-deep .mat-mdc-form-field-icon-prefix > .mat-icon {
397
- padding: 0 var(--rt-spacing-4) 0 var(--rt-spacing-12);
418
+ padding: 0 var(--rt-spacing-4) 0 var(--rt-spacing-10);
398
419
  }
399
420
  }
400
421
 
@@ -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;
Binary file