structra-ui 0.2.55 → 0.2.56

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": "structra-ui",
3
- "version": "0.2.55",
3
+ "version": "0.2.56",
4
4
  "description": "Biblioteca de componentes Angular da StructraLab (UI reutilizável).",
5
5
  "homepage": "https://structralab.com/",
6
6
  "license": "MIT",
@@ -1040,6 +1040,7 @@ declare class SwitchFieldComponent extends BooleanFieldDirective implements Afte
1040
1040
  declare class DropdownBaseComponent {
1041
1041
  private readonly appTheme;
1042
1042
  private readonly overlay;
1043
+ private connectedOverlay?;
1043
1044
  /**
1044
1045
  * O overlay do CDK fica sob `body`; sem estas classes, `var(--app-color-*)` cai no `:root`.
1045
1046
  * Tem de ser **array**: uma única string com espaço quebra `classList.add` e as classes não aplicam.
@@ -1068,11 +1069,18 @@ declare class DropdownBaseComponent {
1068
1069
  /** Empurra o overlay para caber no viewport quando há espaço insuficiente. */
1069
1070
  pushConnectedOverlay: boolean;
1070
1071
  /**
1071
- * Por omissão **reposiciona** o painel quando o viewport ou contentores com scroll se movem
1072
- * (mesma ideia que submenus em `app-menu-list`). Sobrescrever em casos especiais (ex.: fechar ao scroll).
1072
+ * `true`: mantém a última posição escolhida e reancora ao rect do gatilho — evita flip/push bruscos
1073
+ * quando o conteúdo do painel muda (ex.: multiselect que reordena opções ao seleccionar).
1074
+ */
1075
+ lockConnectedOverlayPosition: boolean;
1076
+ /**
1077
+ * Sobrescrever a estratégia CDK (ex.: `noop()` em cenários de teste).
1078
+ * Por omissão: **reposiciona** em desktop; em ambientes sem `(hover: hover)` usa **fecho ao scroll**
1079
+ * da página (lista não fica desalinhada ao rolar o formulário no telemóvel).
1073
1080
  */
1074
1081
  scrollStrategy: ScrollStrategy | null;
1075
- readonly defaultScrollStrategy: _angular_cdk_overlay.RepositionScrollStrategy;
1082
+ readonly repositionScrollStrategy: _angular_cdk_overlay.RepositionScrollStrategy;
1083
+ readonly closeOnOuterScrollStrategy: _angular_cdk_overlay.CloseScrollStrategy;
1076
1084
  get effectiveScrollStrategy(): ScrollStrategy;
1077
1085
  /**
1078
1086
  * `true`: painel sem fundo/borda/sombra próprios — o conteúdo (ex.: `app-menu-list`) define o chrome.
@@ -1090,12 +1098,17 @@ declare class DropdownBaseComponent {
1090
1098
  onOverlayKeydown(ev: KeyboardEvent): void;
1091
1099
  setOpen(next: boolean): void;
1092
1100
  toggle(): void;
1101
+ /**
1102
+ * Após o gatilho ou o painel mudarem de layout com o overlay aberto (ex.: teclado / multiselect).
1103
+ */
1104
+ scheduleOverlayPositionSync(): void;
1093
1105
  static ɵfac: i0.ɵɵFactoryDeclaration<DropdownBaseComponent, never>;
1094
- static ɵcmp: i0.ɵɵComponentDeclaration<DropdownBaseComponent, "app-dropdown-base", never, { "open": { "alias": "open"; "required": false; }; "panelTemplate": { "alias": "panelTemplate"; "required": true; }; "panelWidthPx": { "alias": "panelWidthPx"; "required": false; }; "closeOnEscape": { "alias": "closeOnEscape"; "required": false; }; "hasBackdrop": { "alias": "hasBackdrop"; "required": false; }; "connectedPositions": { "alias": "connectedPositions"; "required": false; }; "pushConnectedOverlay": { "alias": "pushConnectedOverlay"; "required": false; }; "scrollStrategy": { "alias": "scrollStrategy"; "required": false; }; "bareOverlayPanel": { "alias": "bareOverlayPanel"; "required": false; }; }, { "openChange": "openChange"; }, never, ["[appDropdownTrigger]"], true, never>;
1106
+ static ɵcmp: i0.ɵɵComponentDeclaration<DropdownBaseComponent, "app-dropdown-base", never, { "open": { "alias": "open"; "required": false; }; "panelTemplate": { "alias": "panelTemplate"; "required": true; }; "panelWidthPx": { "alias": "panelWidthPx"; "required": false; }; "closeOnEscape": { "alias": "closeOnEscape"; "required": false; }; "hasBackdrop": { "alias": "hasBackdrop"; "required": false; }; "connectedPositions": { "alias": "connectedPositions"; "required": false; }; "pushConnectedOverlay": { "alias": "pushConnectedOverlay"; "required": false; }; "lockConnectedOverlayPosition": { "alias": "lockConnectedOverlayPosition"; "required": false; }; "scrollStrategy": { "alias": "scrollStrategy"; "required": false; }; "bareOverlayPanel": { "alias": "bareOverlayPanel"; "required": false; }; }, { "openChange": "openChange"; }, never, ["[appDropdownTrigger]"], true, never>;
1095
1107
  static ngAcceptInputType_open: unknown;
1096
1108
  static ngAcceptInputType_closeOnEscape: unknown;
1097
1109
  static ngAcceptInputType_hasBackdrop: unknown;
1098
1110
  static ngAcceptInputType_pushConnectedOverlay: unknown;
1111
+ static ngAcceptInputType_lockConnectedOverlayPosition: unknown;
1099
1112
  static ngAcceptInputType_bareOverlayPanel: unknown;
1100
1113
  }
1101
1114
 
@@ -1255,9 +1268,15 @@ declare class MultiselectFieldComponent extends DropdownMultiOptionFieldBase imp
1255
1268
  optionsPanelTpl: TemplateRef<unknown>;
1256
1269
  private readonly dropdownTriggerRootRef;
1257
1270
  private readonly nativeInputRef?;
1271
+ private readonly dropdownBase?;
1258
1272
  panelOpen: boolean;
1259
1273
  panelOverlayWidth: number;
1260
1274
  private scrollLoadTimer;
1275
+ /**
1276
+ * Sem hover primário (telemóvel): o CDK volta a avaliar encaixe quando a lista reordena e o painel
1277
+ * pode «saltar» por cima do campo — `lockPosition` mantém ancoragem ao fundo do gatilho.
1278
+ */
1279
+ get lockOverlayWhileOpen(): boolean;
1261
1280
  ngAfterViewInit(): void;
1262
1281
  writeValue(value: unknown[] | null): void;
1263
1282
  protected afterWriteValue(_value: unknown[]): void;
@@ -1332,6 +1351,11 @@ declare class DropdownSearchFieldComponent extends DropdownOptionFieldBase imple
1332
1351
  get isLockedSelectionDisplay(): boolean;
1333
1352
  /** `readonly` nativo: prop do campo ou bloqueio de exibição da seleção. */
1334
1353
  get isNativeInputReadonly(): boolean;
1354
+ /**
1355
+ * Paginação / API pode devolver o mesmo `value` em mais do que uma linha — `track` só por valor
1356
+ * duplica chaves (aviso NG0955). O índice na vista torna a chave única sem alterar select/multiselect.
1357
+ */
1358
+ trackOption(index: number, opt: UiSelectOption<unknown>): unknown;
1335
1359
  ngOnChanges(changes: SimpleChanges): void;
1336
1360
  ngOnDestroy(): void;
1337
1361
  onDropdownOpenChange(next: boolean, openMode?: DropdownSearchOpenMode): void;
@@ -3112,6 +3136,10 @@ declare class MenuListComponent<T = string> implements OnChanges, AfterViewInit
3112
3136
  */
3113
3137
  persistGroupExpansion: boolean;
3114
3138
  searchable: boolean;
3139
+ /**
3140
+ * Com `searchable`, se `true` limpa o campo e repõe a lista completa após {@link itemSelect}.
3141
+ */
3142
+ limparAposPesquisar: boolean;
3115
3143
  searchPlaceholder: string;
3116
3144
  readonly itemSelect: EventEmitter<T>;
3117
3145
  readonly closeRequest: EventEmitter<void>;
@@ -3128,12 +3156,15 @@ declare class MenuListComponent<T = string> implements OnChanges, AfterViewInit
3128
3156
  get expandAllGroupsWhenSearching(): boolean;
3129
3157
  get showSearchNoResults(): boolean;
3130
3158
  ngOnChanges(changes: SimpleChanges): void;
3159
+ /** `false` quando o corpo já tratou a selecção no mesmo ciclo — não repetir após `afterNextRender`. */
3160
+ private needsDeferredBodyRouteSync;
3131
3161
  /**
3132
3162
  * O corpo do menu só existe após o primeiro render; no drawer mobile isso atrasa `ensureExpanded`
3133
3163
  * relativamente ao `ngOnChanges` do corpo — repetimos após `afterNextRender`.
3134
3164
  */
3135
3165
  private scheduleBodyRouteSelectionSync;
3136
3166
  onSearchQueryInput(value: string | null): void;
3167
+ onMenuItemSelect(id: T): void;
3137
3168
  resetHighlight(): void;
3138
3169
  focusFirstOption(): void;
3139
3170
  /**
@@ -3143,13 +3174,14 @@ declare class MenuListComponent<T = string> implements OnChanges, AfterViewInit
3143
3174
  syncSelectionForMobileDrawerOpen(): void;
3144
3175
  private syncDisplayItems;
3145
3176
  static ɵfac: i0.ɵɵFactoryDeclaration<MenuListComponent<any>, never>;
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>;
3177
+ 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; }; "limparAposPesquisar": { "alias": "limparAposPesquisar"; "required": false; }; "searchPlaceholder": { "alias": "searchPlaceholder"; "required": false; }; }, { "itemSelect": "itemSelect"; "closeRequest": "closeRequest"; "submenuBack": "submenuBack"; "groupToggled": "groupToggled"; "selectionScrollHint": "selectionScrollHint"; }, never, never, true, never>;
3147
3178
  static ngAcceptInputType_dense: unknown;
3148
3179
  static ngAcceptInputType_nested: unknown;
3149
3180
  static ngAcceptInputType_compressText: unknown;
3150
3181
  static ngAcceptInputType_groupCollapsible: unknown;
3151
3182
  static ngAcceptInputType_persistGroupExpansion: unknown;
3152
3183
  static ngAcceptInputType_searchable: unknown;
3184
+ static ngAcceptInputType_limparAposPesquisar: unknown;
3153
3185
  }
3154
3186
 
3155
3187
  /**
@@ -3464,6 +3496,8 @@ declare class AppSidebarComponent<T extends string = string> implements OnChange
3464
3496
  mobileNavOpenPulse: boolean;
3465
3497
  /** Repassado a {@link MenuListComponent.searchable}: campo de pesquisa na lista da lateral. */
3466
3498
  searchable: boolean;
3499
+ /** Repassado a {@link MenuListComponent.limparAposPesquisar}. */
3500
+ limparAposPesquisar: boolean;
3467
3501
  /**
3468
3502
  * Repassado a {@link MenuListComponent.clickToOpen}: submenus na lateral abrem por **clique** (`true`, omissão)
3469
3503
  * ou por **hover** (`false`).
@@ -3525,10 +3559,11 @@ declare class AppSidebarComponent<T extends string = string> implements OnChange
3525
3559
  private scheduleSidebarHeadLayoutGuards;
3526
3560
  private applySidebarHeadLayoutGuards;
3527
3561
  static ɵfac: i0.ɵɵFactoryDeclaration<AppSidebarComponent<any>, 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>;
3562
+ 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; }; "limparAposPesquisar": { "alias": "limparAposPesquisar"; "required": false; }; "clickToOpen": { "alias": "clickToOpen"; "required": false; }; "groupCollapsible": { "alias": "groupCollapsible"; "required": false; }; "groupDefaultExpansion": { "alias": "groupDefaultExpansion"; "required": false; }; }, { "itemSelect": "itemSelect"; }, never, ["[appSidebarBrand]", "[appSidebarToolbar]"], true, never>;
3529
3563
  static ngAcceptInputType_collapsed: unknown;
3530
3564
  static ngAcceptInputType_mobileNavOpenPulse: unknown;
3531
3565
  static ngAcceptInputType_searchable: unknown;
3566
+ static ngAcceptInputType_limparAposPesquisar: unknown;
3532
3567
  static ngAcceptInputType_groupCollapsible: unknown;
3533
3568
  }
3534
3569