structra-ui 0.2.53 → 0.2.55

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.
@@ -9,7 +9,6 @@ import { ICellRendererParams, ColDef, GetRowIdParams, GridReadyEvent } from 'ag-
9
9
  import { ICellRendererAngularComp } from 'ag-grid-angular';
10
10
  import { DialogRef } from '@angular/cdk/dialog';
11
11
  import { Observable } from 'rxjs';
12
- import * as i1 from '@angular/cdk/scrolling';
13
12
 
14
13
  /** Marcador de pacote publicado como `structra-ui`. */
15
14
  declare const STRUCTRA_UI: "structra-ui";
@@ -3091,9 +3090,12 @@ declare class DrawerComponent implements OnChanges, OnDestroy {
3091
3090
  static ngAcceptInputType_showCloseButton: unknown;
3092
3091
  }
3093
3092
 
3094
- declare class MenuListComponent<T = string> implements OnChanges {
3093
+ declare class MenuListComponent<T = string> implements OnChanges, AfterViewInit {
3095
3094
  private readonly cdr;
3095
+ private readonly injector;
3096
+ private readonly destroyRef;
3096
3097
  readonly appTheme: i0.InputSignal<"blue" | "green" | "purple" | "orange" | "white" | "gray" | "sepia" | "black" | AppTheme | undefined>;
3098
+ private bodyRouteSyncGen;
3097
3099
  items: readonly MenuNodeItem<T>[];
3098
3100
  menuId: string;
3099
3101
  dense: boolean;
@@ -3115,19 +3117,33 @@ declare class MenuListComponent<T = string> implements OnChanges {
3115
3117
  readonly closeRequest: EventEmitter<void>;
3116
3118
  readonly submenuBack: EventEmitter<void>;
3117
3119
  readonly groupToggled: i0.OutputEmitterRef<number>;
3120
+ /** Ver {@link MenuListBodyComponent.selectionScrollHint}. */
3121
+ readonly selectionScrollHint: i0.OutputEmitterRef<void>;
3118
3122
  private body?;
3119
3123
  searchQuery: string;
3124
+ constructor();
3125
+ ngAfterViewInit(): void;
3120
3126
  displayItems: MenuNodeItem<T>[];
3121
3127
  get showSearchField(): boolean;
3122
3128
  get expandAllGroupsWhenSearching(): boolean;
3123
3129
  get showSearchNoResults(): boolean;
3124
3130
  ngOnChanges(changes: SimpleChanges): void;
3131
+ /**
3132
+ * O corpo do menu só existe após o primeiro render; no drawer mobile isso atrasa `ensureExpanded`
3133
+ * relativamente ao `ngOnChanges` do corpo — repetimos após `afterNextRender`.
3134
+ */
3135
+ private scheduleBodyRouteSelectionSync;
3125
3136
  onSearchQueryInput(value: string | null): void;
3126
3137
  resetHighlight(): void;
3127
3138
  focusFirstOption(): void;
3139
+ /**
3140
+ * Usado pela `app-sidebar` ao abrir o drawer móvel: garante {@link MenuListBodyComponent.syncRouteSelectionExpansion}
3141
+ * antes do scroll (grupos fechados em `sessionStorage` passam a abrir no caminho do item activo).
3142
+ */
3143
+ syncSelectionForMobileDrawerOpen(): void;
3128
3144
  private syncDisplayItems;
3129
3145
  static ɵfac: i0.ɵɵFactoryDeclaration<MenuListComponent<any>, never>;
3130
- static ɵcmp: i0.ɵɵComponentDeclaration<MenuListComponent<any>, "app-menu-list", never, { "appTheme": { "alias": "appTheme"; "required": false; "isSignal": true; }; "items": { "alias": "items"; "required": true; }; "menuId": { "alias": "menuId"; "required": false; }; "dense": { "alias": "dense"; "required": false; }; "nested": { "alias": "nested"; "required": false; }; "selectedItemId": { "alias": "selectedItemId"; "required": false; }; "compressText": { "alias": "compressText"; "required": false; }; "clickToOpen": { "alias": "clickToOpen"; "required": false; }; "groupCollapsible": { "alias": "groupCollapsible"; "required": false; }; "groupDefaultExpansion": { "alias": "groupDefaultExpansion"; "required": false; }; "persistGroupExpansion": { "alias": "persistGroupExpansion"; "required": false; }; "searchable": { "alias": "searchable"; "required": false; }; "searchPlaceholder": { "alias": "searchPlaceholder"; "required": false; }; }, { "itemSelect": "itemSelect"; "closeRequest": "closeRequest"; "submenuBack": "submenuBack"; "groupToggled": "groupToggled"; }, never, never, true, [{ directive: typeof i1.CdkScrollable; inputs: {}; outputs: {}; }]>;
3146
+ static ɵcmp: i0.ɵɵComponentDeclaration<MenuListComponent<any>, "app-menu-list", never, { "appTheme": { "alias": "appTheme"; "required": false; "isSignal": true; }; "items": { "alias": "items"; "required": true; }; "menuId": { "alias": "menuId"; "required": false; }; "dense": { "alias": "dense"; "required": false; }; "nested": { "alias": "nested"; "required": false; }; "selectedItemId": { "alias": "selectedItemId"; "required": false; }; "compressText": { "alias": "compressText"; "required": false; }; "clickToOpen": { "alias": "clickToOpen"; "required": false; }; "groupCollapsible": { "alias": "groupCollapsible"; "required": false; }; "groupDefaultExpansion": { "alias": "groupDefaultExpansion"; "required": false; }; "persistGroupExpansion": { "alias": "persistGroupExpansion"; "required": false; }; "searchable": { "alias": "searchable"; "required": false; }; "searchPlaceholder": { "alias": "searchPlaceholder"; "required": false; }; }, { "itemSelect": "itemSelect"; "closeRequest": "closeRequest"; "submenuBack": "submenuBack"; "groupToggled": "groupToggled"; "selectionScrollHint": "selectionScrollHint"; }, never, never, true, never>;
3131
3147
  static ngAcceptInputType_dense: unknown;
3132
3148
  static ngAcceptInputType_nested: unknown;
3133
3149
  static ngAcceptInputType_compressText: unknown;
@@ -3430,6 +3446,7 @@ declare class AppSidebarComponent<T extends string = string> implements OnChange
3430
3446
  private readonly cdr;
3431
3447
  private readonly destroyRef;
3432
3448
  private readonly hostEl;
3449
+ private readonly injector;
3433
3450
  private readonly renderer;
3434
3451
  /** Igual a `[appTheme]` / {@link ThemeDirective}: paleta explícita no host; omitir = herdar / serviço. */
3435
3452
  readonly appTheme: i0.InputSignal<"blue" | "green" | "purple" | "orange" | "white" | "gray" | "sepia" | "black" | AppTheme | undefined>;
@@ -3439,6 +3456,12 @@ declare class AppSidebarComponent<T extends string = string> implements OnChange
3439
3456
  selectedItemId: T | null;
3440
3457
  /** Modo estreito: só ícones + `compressText` na lista (rótulos via `title` / `aria-label`). */
3441
3458
  collapsed: boolean;
3459
+ /**
3460
+ * Ligado ao estado do drawer no telemóvel (ex.: `mobileNavOpen` do `app-shell`).
3461
+ * Em cada transição para `true`, volta a agendar o scroll até ao item activo — útil porque `selectedItemId`
3462
+ * pode não mudar entre aberturas e o menu pode ser recriado dentro do `@if (open)` do drawer.
3463
+ */
3464
+ mobileNavOpenPulse: boolean;
3442
3465
  /** Repassado a {@link MenuListComponent.searchable}: campo de pesquisa na lista da lateral. */
3443
3466
  searchable: boolean;
3444
3467
  /**
@@ -3456,6 +3479,7 @@ declare class AppSidebarComponent<T extends string = string> implements OnChange
3456
3479
  */
3457
3480
  groupDefaultExpansion: 'all' | 'first';
3458
3481
  readonly itemSelect: EventEmitter<T>;
3482
+ private menuList?;
3459
3483
  /**
3460
3484
  * Valor efectivo de `compressText` em `app-menu-list`: ao expandir a partir do modo rail,
3461
3485
  * mantém-se comprimido até a animação de largura terminar (evita flicker de texto).
@@ -3465,16 +3489,33 @@ declare class AppSidebarComponent<T extends string = string> implements OnChange
3465
3489
  readonly listCompressText: i0.WritableSignal<boolean>;
3466
3490
  private listRevealTimeoutId;
3467
3491
  private scrollRestoreTimeoutId;
3492
+ /** Invalida tentativas de scroll pendentes (ex.: novo agendamento ou destroy). */
3493
+ private scrollToSelectedGeneration;
3494
+ /** `setTimeout` extra ao abrir o drawer — animação (~240ms) e flex podem atrasar métricas do scroll. */
3495
+ private drawerScrollAssistTimeouts;
3468
3496
  constructor();
3469
3497
  ngAfterViewInit(): void;
3470
3498
  ngOnChanges(changes: SimpleChanges): void;
3471
3499
  /**
3472
- * Garante que o item `--selected` fica inteiro na área útil (margem + cabeçalho sticky),
3473
- * com da opção vizinha visível quando scroll, e movimento suave.
3500
+ * Agenda scroll até ao `--selected` depois do próximo render (filhos OnPush) e reintenta em `rAF`
3501
+ * até o elemento existir necessário no drawer mobile, onde o menu acaba de montar.
3502
+ */
3503
+ /**
3504
+ * Repete o scroll quando o utilizador clica num item já activo mas «cortado» (`selectedItemId` não muda).
3474
3505
  */
3475
- private scrollSidebarToSelectedItem;
3506
+ onSidebarItemSelect(id: T): void;
3507
+ /** Também ligado a `(selectionScrollHint)` em `app-menu-list` para o drawer mobile. */
3508
+ scheduleScrollToSelected(): void;
3509
+ private static readonly SCROLL_TO_SELECTED_MAX_ATTEMPTS;
3510
+ private static readonly SCROLL_TO_SELECTED_MAX_ATTEMPTS_DRAWER;
3511
+ /** Sidebar projectada em `.app-drawer__body` — animação do painel e `overflow` do shell afectam o layout. */
3512
+ private isInsideMobileDrawer;
3513
+ private clearDrawerScrollAssistTimeouts;
3514
+ private runScrollToSelectedRetry;
3476
3515
  /** Após clicar num grupo colapsável: leva o cabeçalho do grupo para a zona visível (como o item seleccionado). */
3477
3516
  onMenuGroupToggled(groupId: number): void;
3517
+ /** Área com scroll dos itens (`cdkScrollable`), não o cabeçalho nem a pesquisa. */
3518
+ private getSidebarMenuListViewport;
3478
3519
  private scrollSidebarScrollAreaToElement;
3479
3520
  /**
3480
3521
  * Metade da altura da linha vizinha (opção ou cabeçalho de grupo) na mesma lista (fallback em px).
@@ -3484,8 +3525,9 @@ declare class AppSidebarComponent<T extends string = string> implements OnChange
3484
3525
  private scheduleSidebarHeadLayoutGuards;
3485
3526
  private applySidebarHeadLayoutGuards;
3486
3527
  static ɵfac: i0.ɵɵFactoryDeclaration<AppSidebarComponent<any>, never>;
3487
- static ɵcmp: i0.ɵɵComponentDeclaration<AppSidebarComponent<any>, "app-sidebar", never, { "appTheme": { "alias": "appTheme"; "required": false; "isSignal": true; }; "items": { "alias": "items"; "required": true; }; "menuId": { "alias": "menuId"; "required": false; }; "selectedItemId": { "alias": "selectedItemId"; "required": false; }; "collapsed": { "alias": "collapsed"; "required": false; }; "searchable": { "alias": "searchable"; "required": false; }; "clickToOpen": { "alias": "clickToOpen"; "required": false; }; "groupCollapsible": { "alias": "groupCollapsible"; "required": false; }; "groupDefaultExpansion": { "alias": "groupDefaultExpansion"; "required": false; }; }, { "itemSelect": "itemSelect"; }, never, ["[appSidebarBrand]", "[appSidebarToolbar]"], true, never>;
3528
+ static ɵcmp: i0.ɵɵComponentDeclaration<AppSidebarComponent<any>, "app-sidebar", never, { "appTheme": { "alias": "appTheme"; "required": false; "isSignal": true; }; "items": { "alias": "items"; "required": true; }; "menuId": { "alias": "menuId"; "required": false; }; "selectedItemId": { "alias": "selectedItemId"; "required": false; }; "collapsed": { "alias": "collapsed"; "required": false; }; "mobileNavOpenPulse": { "alias": "mobileNavOpenPulse"; "required": false; }; "searchable": { "alias": "searchable"; "required": false; }; "clickToOpen": { "alias": "clickToOpen"; "required": false; }; "groupCollapsible": { "alias": "groupCollapsible"; "required": false; }; "groupDefaultExpansion": { "alias": "groupDefaultExpansion"; "required": false; }; }, { "itemSelect": "itemSelect"; }, never, ["[appSidebarBrand]", "[appSidebarToolbar]"], true, never>;
3488
3529
  static ngAcceptInputType_collapsed: unknown;
3530
+ static ngAcceptInputType_mobileNavOpenPulse: unknown;
3489
3531
  static ngAcceptInputType_searchable: unknown;
3490
3532
  static ngAcceptInputType_groupCollapsible: unknown;
3491
3533
  }