@seniorsistemas/angular-components 19.8.0 → 19.9.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.
Files changed (79) hide show
  1. package/bignumber-input/lib/bignumber-input/bignumber-input.directive.d.ts +2 -1
  2. package/code-editor/lib/code-editor/core/facades/core-facade.d.ts +3 -1
  3. package/code-editor/lib/code-editor/infra/cores/codemirror-6/codemirror-6-core.d.ts +12 -2
  4. package/drawer/README.md +119 -0
  5. package/drawer/index.d.ts +5 -0
  6. package/{sidebar/lib/sidebar/sidebar.component.d.ts → drawer/lib/drawer/drawer.component.d.ts} +18 -15
  7. package/drawer/lib/drawer/drawer.module.d.ts +8 -0
  8. package/drawer/public-api.d.ts +2 -0
  9. package/esm2022/bignumber-input/lib/bignumber-input/bignumber-input.directive.mjs +6 -3
  10. package/esm2022/code-editor/lib/code-editor/core/facades/core-facade.mjs +7 -1
  11. package/esm2022/code-editor/lib/code-editor/infra/cores/codemirror-6/codemirror-6-core.mjs +47 -22
  12. package/esm2022/drawer/lib/drawer/drawer.component.mjs +192 -0
  13. package/esm2022/drawer/lib/drawer/drawer.module.mjs +17 -0
  14. package/esm2022/drawer/public-api.mjs +3 -0
  15. package/esm2022/drawer/seniorsistemas-angular-components-drawer.mjs +5 -0
  16. package/esm2022/dynamic-form/dynamic-form/form-field/fields/bignumber/bignumber-field.component.mjs +4 -5
  17. package/esm2022/lib/locale/fallback.mjs +3 -2
  18. package/esm2022/select/lib/select/select.component.mjs +11 -14
  19. package/esm2022/side-sheet/lib/side-sheet/models/side-sheet-config.mjs +2 -0
  20. package/esm2022/side-sheet/lib/side-sheet/models/side-sheet-size.mjs +2 -0
  21. package/esm2022/side-sheet/lib/side-sheet/services/side-sheet.service.mjs +82 -0
  22. package/esm2022/side-sheet/lib/side-sheet/side-sheet.component.mjs +171 -0
  23. package/esm2022/side-sheet/public-api.mjs +3 -0
  24. package/esm2022/side-sheet/seniorsistemas-angular-components-side-sheet.mjs +5 -0
  25. package/esm2022/sidebar/public-api.mjs +12 -3
  26. package/esm2022/switch/lib/switch/switch.component.mjs +5 -3
  27. package/esm2022/switch/lib/switch/switch.module.mjs +2 -2
  28. package/esm2022/tabs/lib/tab-item/tab-item.component.mjs +4 -3
  29. package/esm2022/tabs/lib/tabs/tabs.component.mjs +14 -10
  30. package/esm2022/tiered-menu/lib/tiered-menu/components/tiered-menu/tiered-menu.component.mjs +82 -75
  31. package/esm2022/tiered-menu/lib/tiered-menu/components/tiered-menu-item/tiered-menu-item.component.mjs +3 -3
  32. package/esm2022/tiered-menu/lib/tiered-menu/components/tiered-menu-nested/tiered-menu-nested.component.mjs +35 -18
  33. package/esm2022/tiered-menu/lib/tiered-menu/services/tiered-menu.event.service.mjs +2 -1
  34. package/esm2022/tiered-menu/lib/tiered-menu/tiered-menu.directive.mjs +89 -77
  35. package/esm2022/toast/lib/toast/toast.service.mjs +2 -2
  36. package/fesm2022/seniorsistemas-angular-components-bignumber-input.mjs +5 -2
  37. package/fesm2022/seniorsistemas-angular-components-bignumber-input.mjs.map +1 -1
  38. package/fesm2022/seniorsistemas-angular-components-code-editor.mjs +52 -21
  39. package/fesm2022/seniorsistemas-angular-components-code-editor.mjs.map +1 -1
  40. package/fesm2022/seniorsistemas-angular-components-drawer.mjs +211 -0
  41. package/fesm2022/seniorsistemas-angular-components-drawer.mjs.map +1 -0
  42. package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs +3 -4
  43. package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs.map +1 -1
  44. package/fesm2022/seniorsistemas-angular-components-select.mjs +10 -13
  45. package/fesm2022/seniorsistemas-angular-components-select.mjs.map +1 -1
  46. package/fesm2022/seniorsistemas-angular-components-side-sheet.mjs +257 -0
  47. package/fesm2022/seniorsistemas-angular-components-side-sheet.mjs.map +1 -0
  48. package/fesm2022/seniorsistemas-angular-components-sidebar.mjs +10 -180
  49. package/fesm2022/seniorsistemas-angular-components-sidebar.mjs.map +1 -1
  50. package/fesm2022/seniorsistemas-angular-components-switch.mjs +5 -3
  51. package/fesm2022/seniorsistemas-angular-components-switch.mjs.map +1 -1
  52. package/fesm2022/seniorsistemas-angular-components-tabs.mjs +16 -11
  53. package/fesm2022/seniorsistemas-angular-components-tabs.mjs.map +1 -1
  54. package/fesm2022/seniorsistemas-angular-components-tiered-menu.mjs +201 -164
  55. package/fesm2022/seniorsistemas-angular-components-tiered-menu.mjs.map +1 -1
  56. package/fesm2022/seniorsistemas-angular-components-toast.mjs +1 -1
  57. package/fesm2022/seniorsistemas-angular-components-toast.mjs.map +1 -1
  58. package/fesm2022/seniorsistemas-angular-components.mjs +2 -1
  59. package/fesm2022/seniorsistemas-angular-components.mjs.map +1 -1
  60. package/package.json +19 -7
  61. package/select/lib/select/select.component.d.ts +2 -1
  62. package/side-sheet/README.md +184 -0
  63. package/side-sheet/index.d.ts +5 -0
  64. package/side-sheet/lib/side-sheet/models/side-sheet-config.d.ts +20 -0
  65. package/side-sheet/lib/side-sheet/models/side-sheet-size.d.ts +1 -0
  66. package/side-sheet/lib/side-sheet/services/side-sheet.service.d.ts +49 -0
  67. package/side-sheet/lib/side-sheet/side-sheet.component.d.ts +61 -0
  68. package/side-sheet/public-api.d.ts +4 -0
  69. package/sidebar/README.md +20 -93
  70. package/sidebar/public-api.d.ts +11 -2
  71. package/tabs/lib/tab-item/tab-item.component.d.ts +1 -0
  72. package/tabs/lib/tabs/tabs.component.d.ts +2 -1
  73. package/tiered-menu/lib/tiered-menu/components/tiered-menu/tiered-menu.component.d.ts +19 -7
  74. package/tiered-menu/lib/tiered-menu/components/tiered-menu-nested/tiered-menu-nested.component.d.ts +4 -3
  75. package/tiered-menu/lib/tiered-menu/services/tiered-menu.event.service.d.ts +1 -0
  76. package/tiered-menu/lib/tiered-menu/tiered-menu.directive.d.ts +6 -5
  77. package/esm2022/sidebar/lib/sidebar/sidebar.component.mjs +0 -169
  78. package/esm2022/sidebar/lib/sidebar/sidebar.module.mjs +0 -17
  79. package/sidebar/lib/sidebar/sidebar.module.d.ts +0 -8
@@ -0,0 +1,61 @@
1
+ import { SideSheetService } from './services/side-sheet.service';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * @description Painel que empurra o conteúdo adjacente para a esquerda, dividindo o espaço
5
+ * horizontal com ele — sem escurecer a tela e sem sobrepor o conteúdo, no modo desktop
6
+ * (>= 1024px). Abaixo de 1024px o painel passa a funcionar como um overlay em tela cheia,
7
+ * com fundo escurecido, igual a um Drawer.
8
+ *
9
+ * Fecha somente pelo botão de fechar (X) do cabeçalho — não há fechamento por tecla Escape
10
+ * ou clique fora, em nenhuma resolução. Essa é uma decisão de produto deliberada: o conteúdo
11
+ * por trás do painel permanece interativo (filtros, dropdowns, autocomplete) e um atalho
12
+ * global de Escape entraria em conflito com outros overlays já abertos sobre esse conteúdo.
13
+ *
14
+ * Sem inputs: é uma instância **única** por aplicação, declarada uma vez no shell do app (ex:
15
+ * `app.component.html`, logo abaixo da topbar) e controlada remotamente por
16
+ * `SideSheetService.open()`/`close()` a partir de qualquer componente de rota. Uma segunda
17
+ * instância montada simultaneamente lança um erro em modo de desenvolvimento. O conteúdo
18
+ * projetado dentro do `<s-side-sheet>` é o conteúdo principal da página (ex: o
19
+ * `router-outlet`), empurrado pelo painel quando ele abre.
20
+ *
21
+ * @example
22
+ * ```html
23
+ * <!-- app.component.html -->
24
+ * <s-side-sheet>
25
+ * <router-outlet />
26
+ * </s-side-sheet>
27
+ * ```
28
+ * ```typescript
29
+ * // pedidos.component.ts
30
+ * private readonly sideSheetService = inject(SideSheetService);
31
+ * private readonly panelBody = viewChild<TemplateRef<unknown>>('panelBody');
32
+ *
33
+ * protected selecionarPedido(pedido: Pedido): void {
34
+ * this.sideSheetService.open({ header: pedido.numero, template: this.panelBody()! });
35
+ * }
36
+ * ```
37
+ *
38
+ * @category Overlay
39
+ */
40
+ export declare class SideSheetComponent {
41
+ protected readonly sideSheetService: SideSheetService;
42
+ /** @description Id único usado para associar o título ao painel via `aria-labelledby`. */
43
+ protected readonly titleId: string;
44
+ private readonly titleRef;
45
+ private readonly isDesktopViewport;
46
+ /** @description `true` quando o painel funciona como overlay em tela cheia (< 1024px). */
47
+ protected readonly isOverlayMode: import("@angular/core").Signal<boolean>;
48
+ protected readonly animationMode: import("@angular/core").Signal<"push" | "overlay">;
49
+ /**
50
+ * @description Largura do painel no modo push, por breakpoint. `half` só passa a ser
51
+ * fluido a partir de 1366px — entre 1024–1365px herda os mesmos 400px do `default`
52
+ * (conversão de "Half" para "Default" descrita na especificação de produto).
53
+ */
54
+ protected readonly panelWidthClasses: import("@angular/core").Signal<"[@media(min-width:1024px)]:w-[400px] [@media(min-width:1366px)]:w-[max(400px,50vw)]" | "[@media(min-width:1024px)]:w-[400px] [@media(min-width:1920px)]:w-[480px] [@media(min-width:2560px)]:w-[560px] [@media(min-width:3440px)]:w-[640px]">;
55
+ private _elementToRefocus;
56
+ constructor();
57
+ protected closeSideSheet(): void;
58
+ private _matchesDesktop;
59
+ static ɵfac: i0.ɵɵFactoryDeclaration<SideSheetComponent, never>;
60
+ static ɵcmp: i0.ɵɵComponentDeclaration<SideSheetComponent, "s-side-sheet", never, {}, {}, never, ["*"], true, never>;
61
+ }
@@ -0,0 +1,4 @@
1
+ export { SideSheetComponent } from './lib/side-sheet/side-sheet.component';
2
+ export type { SideSheetSize } from './lib/side-sheet/models/side-sheet-size';
3
+ export type { SideSheetConfig } from './lib/side-sheet/models/side-sheet-config';
4
+ export { SideSheetService } from './lib/side-sheet/services/side-sheet.service';
package/sidebar/README.md CHANGED
@@ -1,117 +1,44 @@
1
1
  # Sidebar
2
2
 
3
- ![Status](https://img.shields.io/badge/status-stable-brightgreen)
3
+ ![Status](https://img.shields.io/badge/status-deprecated-red)
4
4
 
5
- Componente de painel lateral deslizante que aparece sobre o conteúdo vindo do lado direito da tela. Suporta templates customizados para cabeçalho, corpo e rodapé via `sTemplate`, bloqueio automático de scroll e confirmação de fechamento.
5
+ > **Descontinuado** Este pacote é um alias de compatibilidade para o componente `Drawer` e será removido na versão 20.0.0.
6
+
7
+ O pacote `sidebar` re-exporta `DrawerComponent` e `DrawerModule` do pacote `@seniorsistemas/angular-components/drawer`.
6
8
 
7
9
  ## Quando usar
8
10
 
9
- - Exibir detalhes de um item selecionado sem sair da página atual
10
- - Formulários simples de edição rápida sem necessidade de uma nova rota
11
- - Painéis de filtros avançados em listas e tabelas
12
- - Configurações ou propriedades de um elemento da interface
13
- - Fluxos complementares que não devem interromper o contexto principal
11
+ - Apenas para manutenção de código legado que usa `DrawerComponent` ou `DrawerModule` a partir deste pacote
14
12
 
15
13
  ## Quando não usar
16
14
 
17
- - Confirmações de ações destrutivasprefira `ConfirmDialog`
18
- - Conteúdo crítico que exige atenção exclusiva do usuário — prefira `Dialog` modal
19
- - Navegação principal da aplicação — prefira um menu lateral (`nav`) fixo
15
+ - Em todo código novouse `DrawerComponent` ou `DrawerModule` do pacote `@seniorsistemas/angular-components/drawer`
20
16
 
21
- ## Instalação
17
+ ## Migração
22
18
 
23
19
  ```typescript
24
- import { SidebarModule } from '@seniorsistemas/angular-components/sidebar';
25
-
26
- @NgModule({ imports: [SidebarModule] })
27
- export class MeuModule {}
28
- ```
29
-
30
- ## Uso básico
31
-
32
- ```html
33
- <s-sidebar [(visible)]="sidebarAberta" header="Detalhes">
34
- <p>Conteúdo do painel lateral.</p>
35
- </s-sidebar>
36
-
37
- <button (click)="sidebarAberta = true">Abrir Sidebar</button>
38
- ```
39
-
40
- ## API
41
-
42
- ### Inputs
43
-
44
- | Propriedade | Tipo | Padrão | Obrigatório | Descrição |
45
- |-------------|------|--------|:-----------:|-----------|
46
- | `visible` | `ModelSignal<boolean>` | `false` | Não | Controla a visibilidade da sidebar. Suporta `[(visible)]` |
47
- | `closable` | `boolean` | `true` | Não | Exibe o botão de fechar (X) no cabeçalho |
48
- | `dismissible` | `boolean` | `true` | Não | Fechar ao clicar no backdrop (área escurecida fora do painel) |
49
- | `closeOnEscape` | `boolean` | `true` | Não | Fechar ao pressionar a tecla Escape |
50
- | `header` | `string` | `undefined` | Não | Texto exibido no cabeçalho padrão. Substituível via `sTemplate="header"` |
51
- | `largeSized` | `boolean` | `false` | Não | Aumenta a largura da sidebar para acomodar mais conteúdo |
52
- | `cache` | `boolean` | `false` | Não | Mantém o conteúdo no DOM quando fechada, preservando estado interno |
53
- | `registerConfirmClose` | `() => boolean` | `() => true` | Não | Função chamada antes de fechar; retornar `false` bloqueia o fechamento |
54
-
55
- ## Exemplos
20
+ // Antes (descontinuado)
21
+ import { DrawerModule } from '@seniorsistemas/angular-components/sidebar';
56
22
 
57
- ### Sidebar básica
58
-
59
- ```html
60
- <s-sidebar [(visible)]="visible" header="Filtros Avançados" [closable]="true">
61
- <p>Conteúdo do painel.</p>
62
- </s-sidebar>
63
- <s-button label="Abrir" (clicked)="visible = true"></s-button>
64
- ```
65
-
66
- ### Sidebar grande
67
-
68
- ```html
69
- <s-sidebar [(visible)]="visible" header="Edição de Registro" [largeSized]="true">
70
- <!-- formulário complexo -->
71
- </s-sidebar>
23
+ // Depois (recomendado)
24
+ import { DrawerModule } from '@seniorsistemas/angular-components/drawer';
72
25
  ```
73
26
 
74
- ### Com templates customizados
75
-
76
27
  ```html
77
- <s-sidebar [(visible)]="visible">
78
- <ng-template sTemplate="header">
79
- <div style="display: flex; align-items: center; gap: 8px;">
80
- <i class="fa fa-filter"></i>
81
- <span>Filtros Avançados</span>
82
- </div>
83
- </ng-template>
84
- <ng-template sTemplate="body">
85
- <!-- conteúdo do painel -->
86
- </ng-template>
87
- <ng-template sTemplate="footer">
88
- <s-button label="Aplicar" priority="primary" (clicked)="visible = false"></s-button>
89
- </ng-template>
90
- </s-sidebar>
91
- ```
92
-
93
- ### Com confirmação de fechamento
28
+ <!-- Antes (descontinuado) -->
29
+ <s-sidebar></s-sidebar>
94
30
 
95
- ```typescript
96
- confirmClose = (): boolean => {
97
- return window.confirm('Deseja realmente fechar? As alterações serão perdidas.');
98
- };
31
+ <!-- Depois (recomendado) -->
32
+ <s-drawer></s-drawer>
99
33
  ```
100
34
 
101
- ```html
102
- <s-sidebar [(visible)]="visible" [registerConfirmClose]="confirmClose">
103
- <!-- formulário com alterações não salvas -->
104
- </s-sidebar>
105
- ```
35
+ ## Documentação
106
36
 
107
- ## Acessibilidade
37
+ Consulte a documentação completa do componente no Drawer:
108
38
 
109
- - A sidebar utiliza `cdkTrapFocus` para aprisionar o foco dentro do painel enquanto aberta
110
- - Pressionar `Escape` fecha a sidebar quando `closeOnEscape = true`
111
- - O painel entra e sai com animação de deslizamento (300ms) vindo da direita
112
- - Ao abrir, o scroll da página é bloqueado automaticamente e restaurado ao fechar
39
+ - **Storybook**: `Components/Overlay/Drawer`
40
+ - **Pacote**: `@seniorsistemas/angular-components/drawer`
113
41
 
114
42
  ## Componentes relacionados
115
43
 
116
- - [`Dialog`](../dialog/README.md) — modal centralizado para confirmações e conteúdo crítico
117
- - [`SlideInBar`](../slide-in-bar/README.md) — painel que expande/colapsa embutido no layout
44
+ - [`Drawer`](../drawer/README.md) — componente substituto recomendado
@@ -1,2 +1,11 @@
1
- export { SidebarComponent } from './lib/sidebar/sidebar.component';
2
- export { SidebarModule } from './lib/sidebar/sidebar.module';
1
+ import { DrawerComponent as DrawerComponentOriginal, DrawerModule as DrawerModuleOriginal } from '@seniorsistemas/angular-components/drawer';
2
+ /**
3
+ * @deprecated Use DrawerComponent from '@seniorsistemas/angular-components/drawer'.
4
+ * O pacote sidebar será removido na versão 20.0.0.
5
+ */
6
+ export declare const DrawerComponent: typeof DrawerComponentOriginal;
7
+ /**
8
+ * @deprecated Use DrawerModule from '@seniorsistemas/angular-components/drawer'.
9
+ * O pacote sidebar será removido na versão 20.0.0.
10
+ */
11
+ export declare const DrawerModule: typeof DrawerModuleOriginal;
@@ -43,6 +43,7 @@ export declare class TabItemComponent implements AfterViewInit {
43
43
  destroyOnHide: import("@angular/core").InputSignal<boolean>;
44
44
  template: import("@angular/core").Signal<TemplateRef<any> | undefined>;
45
45
  headerElement: import("@angular/core").Signal<TemplateRef<any> | undefined>;
46
+ alreadyOpened: boolean;
46
47
  ngAfterViewInit(): void;
47
48
  static ɵfac: i0.ɵɵFactoryDeclaration<TabItemComponent, never>;
48
49
  static ɵcmp: i0.ɵɵComponentDeclaration<TabItemComponent, "s-tab-item", never, { "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "header": { "alias": "header"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "destroyOnHide": { "alias": "destroyOnHide"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, ["headerTemplateDirectives"], ["*"], true, never>;
@@ -19,7 +19,7 @@ import * as i0 from "@angular/core";
19
19
  export declare class TabsComponent implements OnDestroy {
20
20
  private readonly onDestroy$;
21
21
  protected readonly tabItems: import("@angular/core").Signal<readonly TabItemComponent[]>;
22
- protected readonly activeTabComponent: import("@angular/core").Signal<import("@angular/core").TemplateRef<any> | undefined>;
22
+ protected readonly activeTabComponent: import("@angular/core").Signal<TabItemComponent | undefined>;
23
23
  protected readonly keepAliveTabsContent: import("@angular/core").Signal<TabItemComponent[]>;
24
24
  /**
25
25
  * @description Valor da aba atualmente ativa. Suporta two-way binding via `[(activeTab)]`.
@@ -36,6 +36,7 @@ export declare class TabsComponent implements OnDestroy {
36
36
  * @default 'horizontal'
37
37
  */
38
38
  layoutType: import("@angular/core").InputSignal<"horizontal" | "vertical">;
39
+ private readonly activeTabEffect;
39
40
  constructor();
40
41
  ngOnDestroy(): void;
41
42
  protected onActiveTab(tab: TabItemComponent): void;
@@ -3,23 +3,22 @@ import { TieredMenuItemInternalData } from '../../models/tiered-menu-item-intern
3
3
  import { TieredMenuService } from '../../services/tiered-menu.service';
4
4
  import * as i0 from "@angular/core";
5
5
  export declare class TieredMenuComponent implements OnInit, OnDestroy {
6
- private readonly _appRef;
7
- private readonly _componentFactoryResolver;
6
+ private readonly _overlay;
7
+ private readonly _elementRef;
8
8
  private readonly _injector;
9
+ private readonly _focusTrapFactory;
9
10
  private readonly _changeDetectorRef;
10
11
  readonly tieredMenuService: TieredMenuService;
11
12
  private readonly _tieredMenuEventService;
12
13
  ariaLabel?: string;
13
14
  items: TieredMenuItemInternalData[];
14
- top: number;
15
- left: number;
16
15
  menuTriggerEvent: 'click' | 'hover';
17
16
  isSubmenu: boolean;
17
+ private _overlayRef;
18
18
  private _componentRef;
19
- private _menuDivElement?;
19
+ private _focusTrap;
20
20
  private _unsubscribe$;
21
21
  destroyRequest: EventEmitter<boolean>;
22
- onResize(): void;
23
22
  onDocumentClick(event: MouseEvent): void;
24
23
  onKeydownHandler(event: KeyboardEvent): void;
25
24
  ngOnInit(): void;
@@ -27,9 +26,22 @@ export declare class TieredMenuComponent implements OnInit, OnDestroy {
27
26
  private _focusCurrentItem;
28
27
  private _incrementCurItem;
29
28
  private _decrementCurItem;
29
+ private static readonly SUBMENU_POSITIONS;
30
30
  private _createMenu;
31
+ /**
32
+ * Recreates the flyout chain for whichever item is currently marked `isOpen` in `items`,
33
+ * recursively — used when switching from the nested/mobile menu back to desktop, where the
34
+ * open state lives on the shared item data but each tier is a separate overlay that must be
35
+ * explicitly recreated to match it.
36
+ */
37
+ restoreOpenChain(): void;
38
+ /**
39
+ * Disposes this tier's own submenu overlay chain (if any) without touching `isOpen` state —
40
+ * used when switching from desktop to nested, where the open state must survive but the
41
+ * flyout overlays themselves need to go away.
42
+ */
43
+ disposeChain(): void;
31
44
  private _destroy;
32
- private _setMenuPosition;
33
45
  private _subscribeEvents;
34
46
  static ɵfac: i0.ɵɵFactoryDeclaration<TieredMenuComponent, never>;
35
47
  static ɵcmp: i0.ɵɵComponentDeclaration<TieredMenuComponent, "s-tiered-menu", never, { "ariaLabel": { "alias": "ariaLabel"; "required": false; }; }, { "destroyRequest": "destroyRequest"; }, never, never, true, never>;
@@ -5,16 +5,17 @@ import * as i0 from "@angular/core";
5
5
  export declare class TieredMenuNestedComponent implements OnInit, OnDestroy {
6
6
  readonly tieredMenuService: TieredMenuService;
7
7
  private readonly _tieredMenuEventService;
8
+ private readonly _elementRef;
9
+ private readonly _focusTrapFactory;
8
10
  items: TieredMenuItemInternalData[];
9
- top: number;
10
- left: number;
11
11
  private _lastOpenItem?;
12
+ private _focusTrap;
12
13
  private _unsubscribe$;
13
- onResize(): void;
14
14
  onDocumentClick(event: MouseEvent): void;
15
15
  onKeydownHandler(event: KeyboardEvent): void;
16
16
  ngOnInit(): void;
17
17
  ngOnDestroy(): void;
18
+ private _focusCurrentItem;
18
19
  private _incrementCurItem;
19
20
  private _decrementCurItem;
20
21
  private _closeItem;
@@ -5,6 +5,7 @@ export declare class TieredMenuEventService {
5
5
  incrementCurrentItemEvent: EventEmitter<any>;
6
6
  decrementCurrentItemEvent: EventEmitter<any>;
7
7
  closeAllMenusEvent: EventEmitter<any>;
8
+ restoreFocusEvent: EventEmitter<any>;
8
9
  selectItemEvent: EventEmitter<TieredMenuItemInternalData | null>;
9
10
  openItemMenuEvent: EventEmitter<TieredMenuItemInternalData | null>;
10
11
  closeItemMenuEvent: EventEmitter<TieredMenuItemInternalData | null>;
@@ -16,8 +16,7 @@ import * as i0 from "@angular/core";
16
16
  */
17
17
  export declare class TieredMenuDirective implements OnInit, OnChanges, OnDestroy {
18
18
  private readonly _elementRef;
19
- private readonly _appRef;
20
- private readonly _componentFactoryResolver;
19
+ private readonly _overlay;
21
20
  private readonly _injector;
22
21
  private readonly _tieredMenuEventService;
23
22
  private readonly _tieredMenuService;
@@ -45,6 +44,7 @@ export declare class TieredMenuDirective implements OnInit, OnChanges, OnDestroy
45
44
  ariaLabel?: string;
46
45
  tieredMenuOpened: EventEmitter<void>;
47
46
  tieredMenuClosed: EventEmitter<void>;
47
+ private _overlayRef;
48
48
  private _componentRef;
49
49
  private _showTimeout?;
50
50
  private _isNested;
@@ -53,17 +53,18 @@ export declare class TieredMenuDirective implements OnInit, OnChanges, OnDestroy
53
53
  private _lastActiveElement?;
54
54
  private _previousItems;
55
55
  private _itemsAreValid?;
56
- private _resizeObserver;
57
56
  ngOnInit(): void;
58
57
  ngOnChanges(): void;
59
58
  ngOnDestroy(): void;
60
59
  onClick(event: MouseEvent): void;
60
+ onWindowResize(): void;
61
+ private _disposeOverlay;
61
62
  private _createMenu;
63
+ private static readonly DESKTOP_POSITIONS;
64
+ private static readonly NESTED_POSITIONS;
62
65
  private _createTieredMenu;
63
66
  private _createNestedMenu;
64
- private _createComponent;
65
67
  private _destroy;
66
- private _setMenuPosition;
67
68
  private _setMenuComponentProperties;
68
69
  private _subscribeEvents;
69
70
  private _compareItems;
@@ -1,169 +0,0 @@
1
- import { animate, style, transition, trigger } from '@angular/animations';
2
- import { CdkTrapFocus } from '@angular/cdk/a11y';
3
- import { NgTemplateOutlet } from '@angular/common';
4
- import { Component, contentChild, ContentChildren, effect, Input, model, } from '@angular/core';
5
- import { FooterComponent } from '@seniorsistemas/angular-components/structure';
6
- import { TemplateDirective } from '@seniorsistemas/angular-components/template';
7
- import { disableScroll, enableScroll } from '@seniorsistemas/angular-components/utils';
8
- import * as i0 from "@angular/core";
9
- /**
10
- * @description Componente de painel lateral deslizante (sidebar) que aparece sobre o conteúdo
11
- * vindo do lado direito da tela. Suporta templates customizados para cabeçalho, corpo e rodapé
12
- * via `sTemplate`, bloqueio de scroll automático e confirmação de fechamento.
13
- *
14
- * @example
15
- * ```html
16
- * <s-sidebar [(visible)]="sidebarOpen" header="Filtros" [closable]="true">
17
- * <ng-template sTemplate="body">Conteúdo</ng-template>
18
- * </s-sidebar>
19
- * ```
20
- *
21
- * @category Overlay
22
- */
23
- export class SidebarComponent {
24
- templates = null;
25
- /**
26
- * @description Controla a visibilidade da sidebar. Suporta two-way binding via `[(visible)]`.
27
- *
28
- * @default false
29
- */
30
- visible = model(false);
31
- /**
32
- * @description Quando `true`, exibe o botão de fechar (X) no cabeçalho da sidebar.
33
- *
34
- * @default true
35
- */
36
- closable = true;
37
- /**
38
- * @description Quando `true`, clicar no backdrop (área escurecida fora da sidebar) fecha o painel.
39
- *
40
- * @default true
41
- */
42
- dismissible = true;
43
- /**
44
- * @description Quando `true`, pressionar a tecla Escape fecha a sidebar.
45
- *
46
- * @default true
47
- */
48
- closeOnEscape = true;
49
- /**
50
- * @description Texto exibido no cabeçalho padrão da sidebar.
51
- * Pode ser substituído por um template customizado via `sTemplate="header"`.
52
- */
53
- header;
54
- /**
55
- * @description Quando `true`, aumenta a largura da sidebar para acomodar mais conteúdo.
56
- *
57
- * @default false
58
- */
59
- largeSized = false;
60
- /**
61
- * @description Quando `true`, mantém o conteúdo da sidebar no DOM mesmo quando oculta,
62
- * preservando o estado interno dos componentes filhos.
63
- *
64
- * @default false
65
- */
66
- cache = false;
67
- /**
68
- * @description Função de confirmação chamada antes de fechar a sidebar.
69
- * Quando retornar `false`, o fechamento é bloqueado. Útil para validar formulários não salvos.
70
- */
71
- set registerConfirmClose(fn) {
72
- this._confirmClose = fn;
73
- }
74
- headerTemplate = null;
75
- bodyTemplate = null;
76
- footerTemplate = null;
77
- footerComponent = contentChild(FooterComponent);
78
- _confirmClose = () => true;
79
- visibleEffect = effect(() => {
80
- const visible = this.visible();
81
- if (visible) {
82
- disableScroll();
83
- }
84
- else {
85
- enableScroll();
86
- }
87
- });
88
- ngAfterContentInit() {
89
- this._getTemplates();
90
- }
91
- ngOnDestroy() {
92
- this.visibleEffect.destroy();
93
- }
94
- closeSidebar() {
95
- if (this._confirmClose()) {
96
- this.visible.set(false);
97
- }
98
- }
99
- handleEscape() {
100
- if (this.closeOnEscape) {
101
- this.closeSidebar();
102
- }
103
- }
104
- _getCustomTemplate(type) {
105
- return this.templates?.find((template) => template.type === type)?.template ?? null;
106
- }
107
- getHeaderTemplate() {
108
- return this._getCustomTemplate('header') ?? null;
109
- }
110
- getBodyTemplate() {
111
- return this._getCustomTemplate('body') ?? null;
112
- }
113
- getFooterTemplate() {
114
- return this._getCustomTemplate('footer') ?? null;
115
- }
116
- _getTemplates() {
117
- this.headerTemplate = this.getHeaderTemplate();
118
- this.bodyTemplate = this.getBodyTemplate();
119
- this.footerTemplate = this.getFooterTemplate();
120
- }
121
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SidebarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
122
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: SidebarComponent, isStandalone: true, selector: "s-sidebar", inputs: { visible: { classPropertyName: "visible", publicName: "visible", isSignal: true, isRequired: false, transformFunction: null }, closable: { classPropertyName: "closable", publicName: "closable", isSignal: false, isRequired: false, transformFunction: null }, dismissible: { classPropertyName: "dismissible", publicName: "dismissible", isSignal: false, isRequired: false, transformFunction: null }, closeOnEscape: { classPropertyName: "closeOnEscape", publicName: "closeOnEscape", isSignal: false, isRequired: false, transformFunction: null }, header: { classPropertyName: "header", publicName: "header", isSignal: false, isRequired: false, transformFunction: null }, largeSized: { classPropertyName: "largeSized", publicName: "largeSized", isSignal: false, isRequired: false, transformFunction: null }, cache: { classPropertyName: "cache", publicName: "cache", isSignal: false, isRequired: false, transformFunction: null }, registerConfirmClose: { classPropertyName: "registerConfirmClose", publicName: "registerConfirmClose", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { visible: "visibleChange" }, host: { listeners: { "document:keydown.escape": "handleEscape()" } }, queries: [{ propertyName: "footerComponent", first: true, predicate: FooterComponent, descendants: true, isSignal: true }, { propertyName: "templates", predicate: TemplateDirective }], ngImport: i0, template: "@if (visible()) {\n <div\n class=\"backdrop\"\n (click)=\"dismissible && closeSidebar()\"\n ></div>\n}\n\n@if (cache || visible()) {\n <div\n cdkTrapFocus\n [cdkTrapFocusAutoCapture]=\"visible()\"\n [@visibilityChanged]\n class=\"sidebar\"\n [class.sidebar--open]=\"visible()\"\n [class.sidebar--large-size]=\"largeSized\"\n >\n <div class=\"sidebar__header\">\n @if (headerTemplate) {\n <ng-template *ngTemplateOutlet=\"headerTemplate\"></ng-template>\n } @else {\n <span class=\"sidebar__header__title\">{{ header }}</span>\n }\n @if (closable) {\n <button\n class=\"sidebar__header__close fa-solid fa-xmark\"\n (click)=\"closeSidebar()\"\n ></button>\n }\n </div>\n <div class=\"sidebar__body\">\n @if (bodyTemplate) {\n <ng-template [ngTemplateOutlet]=\"bodyTemplate\"></ng-template>\n } @else {\n <ng-content select=\":not(s-footer)\"></ng-content>\n }\n </div>\n @if (footerTemplate || footerComponent()) {\n <div class=\"sidebar__footer\">\n @if (footerTemplate) {\n <ng-template [ngTemplateOutlet]=\"footerTemplate\"></ng-template>\n } @else {\n <ng-content select=\"s-footer\"></ng-content>\n }\n </div>\n }\n </div>\n}\n\n", styles: [".backdrop{background-color:#00000080;height:100%;left:0;position:fixed;top:0;transition:opacity .3s;width:100%;z-index:998}.sidebar{background-color:#fff;box-shadow:0 1px 5px #00000040;display:flex;flex-direction:column;height:100%;right:-100%;padding:1rem;position:fixed;top:0;transition:right .3s;width:100%;z-index:999}.sidebar__header{border-bottom:1px solid #dedce5;display:flex;justify-content:space-between;padding-bottom:.75rem}.sidebar__header__title{color:#212533;font-family:Inter,sans-serif;font-size:1rem;text-transform:uppercase;-webkit-user-select:none;user-select:none}.sidebar__header__close{background-color:transparent;border:none;color:#212533;cursor:pointer;font-size:1rem;padding:.5rem}.sidebar__body{flex-grow:1;overflow:auto;padding:1rem .5rem}.sidebar__footer{border-top:1px solid #dedce5;padding-top:.75rem}.sidebar--open{right:0}@media (min-width: 768px){.sidebar{width:75%}}@media (min-width: 992px){.sidebar{width:50%}}\n"], dependencies: [{ kind: "directive", type: CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], animations: [
123
- trigger('visibilityChanged', [
124
- transition(':enter', [
125
- style({ transform: 'translateX(100%)' }),
126
- animate('300ms', style({ transform: 'translateX(0)' })),
127
- ]),
128
- transition(':leave', [
129
- style({ transform: 'translateX(0)' }),
130
- animate('300ms', style({ transform: 'translateX(100%)' })),
131
- ]),
132
- ]),
133
- ] });
134
- }
135
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SidebarComponent, decorators: [{
136
- type: Component,
137
- args: [{ selector: 's-sidebar', host: {
138
- '(document:keydown.escape)': 'handleEscape()',
139
- }, animations: [
140
- trigger('visibilityChanged', [
141
- transition(':enter', [
142
- style({ transform: 'translateX(100%)' }),
143
- animate('300ms', style({ transform: 'translateX(0)' })),
144
- ]),
145
- transition(':leave', [
146
- style({ transform: 'translateX(0)' }),
147
- animate('300ms', style({ transform: 'translateX(100%)' })),
148
- ]),
149
- ]),
150
- ], standalone: true, imports: [CdkTrapFocus, NgTemplateOutlet], template: "@if (visible()) {\n <div\n class=\"backdrop\"\n (click)=\"dismissible && closeSidebar()\"\n ></div>\n}\n\n@if (cache || visible()) {\n <div\n cdkTrapFocus\n [cdkTrapFocusAutoCapture]=\"visible()\"\n [@visibilityChanged]\n class=\"sidebar\"\n [class.sidebar--open]=\"visible()\"\n [class.sidebar--large-size]=\"largeSized\"\n >\n <div class=\"sidebar__header\">\n @if (headerTemplate) {\n <ng-template *ngTemplateOutlet=\"headerTemplate\"></ng-template>\n } @else {\n <span class=\"sidebar__header__title\">{{ header }}</span>\n }\n @if (closable) {\n <button\n class=\"sidebar__header__close fa-solid fa-xmark\"\n (click)=\"closeSidebar()\"\n ></button>\n }\n </div>\n <div class=\"sidebar__body\">\n @if (bodyTemplate) {\n <ng-template [ngTemplateOutlet]=\"bodyTemplate\"></ng-template>\n } @else {\n <ng-content select=\":not(s-footer)\"></ng-content>\n }\n </div>\n @if (footerTemplate || footerComponent()) {\n <div class=\"sidebar__footer\">\n @if (footerTemplate) {\n <ng-template [ngTemplateOutlet]=\"footerTemplate\"></ng-template>\n } @else {\n <ng-content select=\"s-footer\"></ng-content>\n }\n </div>\n }\n </div>\n}\n\n", styles: [".backdrop{background-color:#00000080;height:100%;left:0;position:fixed;top:0;transition:opacity .3s;width:100%;z-index:998}.sidebar{background-color:#fff;box-shadow:0 1px 5px #00000040;display:flex;flex-direction:column;height:100%;right:-100%;padding:1rem;position:fixed;top:0;transition:right .3s;width:100%;z-index:999}.sidebar__header{border-bottom:1px solid #dedce5;display:flex;justify-content:space-between;padding-bottom:.75rem}.sidebar__header__title{color:#212533;font-family:Inter,sans-serif;font-size:1rem;text-transform:uppercase;-webkit-user-select:none;user-select:none}.sidebar__header__close{background-color:transparent;border:none;color:#212533;cursor:pointer;font-size:1rem;padding:.5rem}.sidebar__body{flex-grow:1;overflow:auto;padding:1rem .5rem}.sidebar__footer{border-top:1px solid #dedce5;padding-top:.75rem}.sidebar--open{right:0}@media (min-width: 768px){.sidebar{width:75%}}@media (min-width: 992px){.sidebar{width:50%}}\n"] }]
151
- }], propDecorators: { templates: [{
152
- type: ContentChildren,
153
- args: [TemplateDirective]
154
- }], closable: [{
155
- type: Input
156
- }], dismissible: [{
157
- type: Input
158
- }], closeOnEscape: [{
159
- type: Input
160
- }], header: [{
161
- type: Input
162
- }], largeSized: [{
163
- type: Input
164
- }], cache: [{
165
- type: Input
166
- }], registerConfirmClose: [{
167
- type: Input
168
- }] } });
169
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lkZWJhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNvbXBvbmVudHMvc2lkZWJhci9zcmMvbGliL3NpZGViYXIvc2lkZWJhci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNvbXBvbmVudHMvc2lkZWJhci9zcmMvbGliL3NpZGViYXIvc2lkZWJhci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDMUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ25ELE9BQU8sRUFFSCxTQUFTLEVBQ1QsWUFBWSxFQUNaLGVBQWUsRUFDZixNQUFNLEVBQ04sS0FBSyxFQUNMLEtBQUssR0FJUixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDL0UsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDaEYsT0FBTyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQzs7QUFFdkY7Ozs7Ozs7Ozs7Ozs7R0FhRztBQXVCSCxNQUFNLE9BQU8sZ0JBQWdCO0lBRWxCLFNBQVMsR0FBd0MsSUFBSSxDQUFDO0lBRTdEOzs7O09BSUc7SUFDSSxPQUFPLEdBQUcsS0FBSyxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBRXZDOzs7O09BSUc7SUFFSSxRQUFRLEdBQUcsSUFBSSxDQUFDO0lBRXZCOzs7O09BSUc7SUFFSSxXQUFXLEdBQUcsSUFBSSxDQUFDO0lBRTFCOzs7O09BSUc7SUFFSSxhQUFhLEdB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J0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xyXG5pbXBvcnQgeyBDZGtUcmFwRm9jdXMgfSBmcm9tICdAYW5ndWxhci9jZGsvYTExeSc7XHJcbmltcG9ydCB7IE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQge1xyXG4gICAgQWZ0ZXJDb250ZW50SW5pdCxcclxuICAgIENvbXBvbmVudCxcclxuICAgIGNvbnRlbnRDaGlsZCxcclxuICAgIENvbnRlbnRDaGlsZHJlbixcclxuICAgIGVmZmVjdCxcclxuICAgIElucHV0LFxyXG4gICAgbW9kZWwsXHJcbiAgICBPbkRlc3Ryb3ksXHJcbiAgICBRdWVyeUxpc3QsXHJcbiAgICBUZW1wbGF0ZVJlZixcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9vdGVyQ29tcG9uZW50IH0gZnJvbSAnQHNlbmlvcnNpc3RlbWFzL2FuZ3VsYXItY29tcG9uZW50cy9zdHJ1Y3R1cmUnO1xyXG5pbXBvcnQgeyBUZW1wbGF0ZURpcmVjdGl2ZSB9IGZyb20gJ0BzZW5pb3JzaXN0ZW1hcy9hbmd1bGFyLWNvbXBvbmVudHMvdGVtcGxhdGUnO1xyXG5pbXBvcnQgeyBkaXNhYmxlU2Nyb2xsLCBlbmFibGVTY3JvbGwgfSBmcm9tICdAc2VuaW9yc2lzdGVtYXMvYW5ndWxhci1jb21wb25lbnRzL3V0aWxzJztcclxuXHJcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gQ29tcG9uZW50ZSBkZSBwYWluZWwgbGF0ZXJhbCBkZXNsaXphbnRlIChzaWRlYmFyKSBxdWUgYXBhcmVjZSBzb2JyZSBvIGNvbnRlw7pkb1xyXG4gKiB2aW5kbyBkbyBsYWRvIGRpcmVpdG8gZGEgdGVsYS4gU3Vwb3J0YSB0ZW1wbGF0ZXMgY3VzdG9taXphZG9zIHBhcmEgY2FiZcOnYWxobywgY29ycG8gZSByb2RhcMOpXHJcbiAqIHZpYSBgc1RlbXBsYXRlYCwgYmxvcXVlaW8gZGUgc2Nyb2xsIGF1dG9tw6F0aWNvIGUgY29uZmlybWHDp8OjbyBkZSBmZWNoYW1lbnRvLlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGBodG1sXHJcbiAqIDxzLXNpZGViYXIgWyh2aXNpYmxlKV09XCJzaWRlYmFyT3BlblwiIGhlYWRlcj1cIkZpbHRyb3NcIiBbY2xvc2FibGVdPVwidHJ1ZVwiPlxyXG4gKiAgIDxuZy10ZW1wbGF0ZSBzVGVtcGxhdGU9XCJib2R5XCI+Q29udGXDumRvPC9uZy10ZW1wbGF0ZT5cclxuICogPC9zLXNpZGViYXI+XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAY2F0ZWdvcnkgT3ZlcmxheVxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ3Mtc2lkZWJhcicsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vc2lkZWJhci5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9zaWRlYmFyLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgICBob3N0OiB7XHJcbiAgICAgICAgJyhkb2N1bWVudDprZXlkb3duLmVzY2FwZSknOiAnaGFuZGxlRXNjYXBlKCknLFxyXG4gICAgfSxcclxuICAgIGFuaW1hdGlvbnM6IFtcclxuICAgICAgICB0cmlnZ2VyKCd2aXNpYmlsaXR5Q2hhbmdlZCcsIFtcclxuICAgICAgICAgICAgdHJhbnNpdGlvbignOmVudGVyJywgW1xyXG4gICAgICAgICAgICAgICAgc3R5bGUoeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKDEwMCUpJyB9KSxcclxuICAgICAgICAgICAgICAgIGFuaW1hdGUoJzMwMG1zJywgc3R5bGUoeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKDApJyB9KSksXHJcbiAgICAgICAgICAgIF0pLFxyXG4gICAgICAgICAgICB0cmFuc2l0aW9uKCc6bGVhdmUnLCBbXHJcbiAgICAgICAgICAgICAgICBzdHlsZSh7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVgoMCknIH0pLFxyXG4gICAgICAgICAgICAgICAgYW5pbWF0ZSgnMzAwbXMnLCBzdHlsZSh7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVgoMTAwJSknIH0pKSxcclxuICAgICAgICAgICAgXSksXHJcbiAgICAgICAgXSksXHJcbiAgICBdLFxyXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICAgIGltcG9ydHM6IFtDZGtUcmFwRm9jdXMsIE5nVGVtcGxhdGVPdXRsZXRdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgU2lkZWJhckNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQsIE9uRGVzdHJveSB7XHJcbiAgICBAQ29udGVudENoaWxkcmVuKFRlbXBsYXRlRGlyZWN0aXZlKVxyXG4gICAgcHVibGljIHRlbXBsYXRlczogUXVlcnlMaXN0PFRlbXBsYXRlRGlyZWN0aXZlPiB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIENvbnRyb2xhIGEgdmlzaWJpbGlkYWRlIGRhIHNpZGViYXIuIFN1cG9ydGEgdHdvLXdheSBiaW5kaW5nIHZpYSBgWyh2aXNpYmxlKV1gLlxyXG4gICAgICpcclxuICAgICAqIEBkZWZhdWx0IGZhbHNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB2aXNpYmxlID0gbW9kZWw8Ym9vbGVhbj4oZmFsc2UpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFF1YW5kbyBgdHJ1ZWAsIGV4aWJlIG8gYm90w6NvIGRlIGZlY2hhciAoWCkgbm8gY2FiZcOnYWxobyBkYSBzaWRlYmFyLlxyXG4gICAgICpcclxuICAgICAqIEBkZWZhdWx0IHRydWVcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBjbG9zYWJsZSA9IHRydWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gUXVhbmRvIGB0cnVlYCwgY2xpY2FyIG5vIGJhY2tkcm9wICjDoXJlYSBlc2N1cmVjaWRhIGZvcmEgZGEgc2lkZWJhcikgZmVjaGEgbyBwYWluZWwuXHJcbiAgICAgKlxyXG4gICAgICogQGRlZmF1bHQgdHJ1ZVxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGRpc21pc3NpYmxlID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBRdWFuZG8gYHRydWVgLCBwcmVzc2lvbmFyIGEgdGVjbGEgRXNjYXBlIGZlY2hhIGEgc2lkZWJhci5cclxuICAgICAqXHJcbiAgICAgKiBAZGVmYXVsdCB0cnVlXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgY2xvc2VPbkVzY2FwZSA9IHRydWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gVGV4dG8gZXhpYmlkbyBubyBjYWJlw6dhbGhvIHBhZHLDo28gZGEgc2lkZWJhci5cclxuICAgICAqIFBvZGUgc2VyIHN1YnN0aXR1w61kbyBwb3IgdW0gdGVtcGxhdGUgY3VzdG9taXphZG8gdmlhIGBzVGVtcGxhdGU9XCJoZWFkZXJcImAuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgaGVhZGVyPzogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFF1YW5kbyBgdHJ1ZWAsIGF1bWVudGEgYSBsYXJndXJhIGRhIHNpZGViYXIgcGFyYSBhY29tb2RhciBtYWlzIGNvbnRlw7pkby5cclxuICAgICAqXHJcbiAgICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGxhcmdlU2l6ZWQgPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBRdWFuZG8gYHRydWVgLCBtYW50w6ltIG8gY29udGXDumRvIGRhIHNpZGViYXIgbm8gRE9NIG1lc21vIHF1YW5kbyBvY3VsdGEsXHJcbiAgICAgKiBwcmVzZXJ2YW5kbyBvIGVzdGFkbyBpbnRlcm5vIGRvcyBjb21wb25lbnRlcyBmaWxob3MuXHJcbiAgICAgKlxyXG4gICAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBjYWNoZSA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEZ1bsOnw6NvIGRlIGNvbmZpcm1hw6fDo28gY2hhbWFkYSBhbnRlcyBkZSBmZWNoYXIgYSBzaWRlYmFyLlxyXG4gICAgICogUXVhbmRvIHJldG9ybmFyIGBmYWxzZWAsIG8gZmVjaGFtZW50byDDqSBibG9xdWVhZG8uIMOadGlsIHBhcmEgdmFsaWRhciBmb3JtdWzDoXJpb3MgbsOjbyBzYWx2b3MuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgc2V0IHJlZ2lzdGVyQ29uZmlybUNsb3NlKGZuOiAoKSA9PiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5fY29uZmlybUNsb3NlID0gZm47XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGhlYWRlclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjx1bmtub3duPiB8IG51bGwgPSBudWxsO1xyXG4gICAgcHVibGljIGJvZHlUZW1wbGF0ZTogVGVtcGxhdGVSZWY8dW5rbm93bj4gfCBudWxsID0gbnVsbDtcclxuICAgIHB1YmxpYyBmb290ZXJUZW1wbGF0ZTogVGVtcGxhdGVSZWY8dW5rbm93bj4gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZm9vdGVyQ29tcG9uZW50ID0gY29udGVudENoaWxkKEZvb3RlckNvbXBvbmVudCk7XHJcblxyXG4gICAgcHJpdmF0ZSBfY29uZmlybUNsb3NlID0gKCkgPT4gdHJ1ZTtcclxuXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IHZpc2libGVFZmZlY3QgPSBlZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHZpc2libGUgPSB0aGlzLnZpc2libGUoKTtcclxuICAgICAgICBpZiAodmlzaWJsZSkge1xyXG4gICAgICAgICAgICBkaXNhYmxlU2Nyb2xsKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZW5hYmxlU2Nyb2xsKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcHVibGljIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9nZXRUZW1wbGF0ZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy52aXNpYmxlRWZmZWN0LmRlc3Ryb3koKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY2xvc2VTaWRlYmFyKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLl9jb25maXJtQ2xvc2UoKSkge1xyXG4gICAgICAgICAgICB0aGlzLnZpc2libGUuc2V0KGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGhhbmRsZUVzY2FwZSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5jbG9zZU9uRXNjYXBlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2xvc2VTaWRlYmFyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2dldEN1c3RvbVRlbXBsYXRlKHR5cGU6IHN0cmluZyk6IFRlbXBsYXRlUmVmPGFueT4gfCBudWxsIHtcclxuICAgICAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZXM/LmZpbmQoKHRlbXBsYXRlOiBUZW1wbGF0ZURpcmVjdGl2ZSkgPT4gdGVtcGxhdGUudHlwZSA9PT0gdHlwZSk/LnRlbXBsYXRlID8/IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRIZWFkZXJUZW1wbGF0ZSgpOiBUZW1wbGF0ZVJlZjx1bmtub3duPiB8IG51bGwge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRDdXN0b21UZW1wbGF0ZSgnaGVhZGVyJykgPz8gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldEJvZHlUZW1wbGF0ZSgpOiBUZW1wbGF0ZVJlZjx1bmtub3duPiB8IG51bGwge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRDdXN0b21UZW1wbGF0ZSgnYm9keScpID8/IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRGb290ZXJUZW1wbGF0ZSgpOiBUZW1wbGF0ZVJlZjx1bmtub3duPiB8IG51bGwge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRDdXN0b21UZW1wbGF0ZSgnZm9vdGVyJykgPz8gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9nZXRUZW1wbGF0ZXMoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5oZWFkZXJUZW1wbGF0ZSA9IHRoaXMuZ2V0SGVhZGVyVGVtcGxhdGUoKTtcclxuICAgICAgICB0aGlzLmJvZHlUZW1wbGF0ZSA9IHRoaXMuZ2V0Qm9keVRlbXBsYXRlKCk7XHJcbiAgICAgICAgdGhpcy5mb290ZXJUZW1wbGF0ZSA9IHRoaXMuZ2V0Rm9vdGVyVGVtcGxhdGUoKTtcclxuICAgIH1cclxufVxyXG4iLCJAaWYgKHZpc2libGUoKSkge1xuICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJiYWNrZHJvcFwiXG4gICAgICAgIChjbGljayk9XCJkaXNtaXNzaWJsZSAmJiBjbG9zZVNpZGViYXIoKVwiXG4gICAgPjwvZGl2PlxufVxuXG5AaWYgKGNhY2hlIHx8IHZpc2libGUoKSkge1xuICAgIDxkaXZcbiAgICAgICAgY2RrVHJhcEZvY3VzXG4gICAgICAgIFtjZGtUcmFwRm9jdXNBdXRvQ2FwdHVyZV09XCJ2aXNpYmxlKClcIlxuICAgICAgICBbQHZpc2liaWxpdHlDaGFuZ2VkXVxuICAgICAgICBjbGFzcz1cInNpZGViYXJcIlxuICAgICAgICBbY2xhc3Muc2lkZWJhci0tb3Blbl09XCJ2aXNpYmxlKClcIlxuICAgICAgICBbY2xhc3Muc2lkZWJhci0tbGFyZ2Utc2l6ZV09XCJsYXJnZVNpemVkXCJcbiAgICA+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzaWRlYmFyX19oZWFkZXJcIj5cbiAgICAgICAgICAgIEBpZiAoaGVhZGVyVGVtcGxhdGUpIHtcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgKm5nVGVtcGxhdGVPdXRsZXQ9XCJoZWFkZXJUZW1wbGF0ZVwiPjwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNpZGViYXJfX2hlYWRlcl9fdGl0bGVcIj57eyBoZWFkZXIgfX08L3NwYW4+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKGNsb3NhYmxlKSB7XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNpZGViYXJfX2hlYWRlcl9fY2xvc2UgZmEtc29saWQgZmEteG1hcmtcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xvc2VTaWRlYmFyKClcIlxuICAgICAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzaWRlYmFyX19ib2R5XCI+XG4gICAgICAgICAgICBAaWYgKGJvZHlUZW1wbGF0ZSkge1xuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJib2R5VGVtcGxhdGVcIj48L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiOm5vdChzLWZvb3RlcilcIj48L25nLWNvbnRlbnQ+XG4gICAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICBAaWYgKGZvb3RlclRlbXBsYXRlIHx8IGZvb3RlckNvbXBvbmVudCgpKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2lkZWJhcl9fZm9vdGVyXCI+XG4gICAgICAgICAgICAgICAgQGlmIChmb290ZXJUZW1wbGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiZm9vdGVyVGVtcGxhdGVcIj48L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJzLWZvb3RlclwiPjwvbmctY29udGVudD5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgIDwvZGl2PlxufVxuXG4iXX0=
@@ -1,17 +0,0 @@
1
- import { NgModule } from '@angular/core';
2
- import { SidebarComponent } from './sidebar.component';
3
- import { TemplateModule } from '@seniorsistemas/angular-components/template';
4
- import * as i0 from "@angular/core";
5
- export class SidebarModule {
6
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SidebarModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
7
- static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.14", ngImport: i0, type: SidebarModule, imports: [SidebarComponent], exports: [SidebarComponent, TemplateModule] });
8
- static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SidebarModule, imports: [TemplateModule] });
9
- }
10
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SidebarModule, decorators: [{
11
- type: NgModule,
12
- args: [{
13
- imports: [SidebarComponent],
14
- exports: [SidebarComponent, TemplateModule],
15
- }]
16
- }] });
17
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lkZWJhci5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNvbXBvbmVudHMvc2lkZWJhci9zcmMvbGliL3NpZGViYXIvc2lkZWJhci5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV6QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNkNBQTZDLENBQUM7O0FBTTdFLE1BQU0sT0FBTyxhQUFhO3dHQUFiLGFBQWE7eUdBQWIsYUFBYSxZQUhaLGdCQUFnQixhQUNoQixnQkFBZ0IsRUFBRSxjQUFjO3lHQUVqQyxhQUFhLFlBRk0sY0FBYzs7NEZBRWpDLGFBQWE7a0JBSnpCLFFBQVE7bUJBQUM7b0JBQ04sT0FBTyxFQUFFLENBQUMsZ0JBQWdCLENBQUM7b0JBQzNCLE9BQU8sRUFBRSxDQUFDLGdCQUFnQixFQUFFLGNBQWMsQ0FBQztpQkFDOUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHsgU2lkZWJhckNvbXBvbmVudCB9IGZyb20gJy4vc2lkZWJhci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBUZW1wbGF0ZU1vZHVsZSB9IGZyb20gJ0BzZW5pb3JzaXN0ZW1hcy9hbmd1bGFyLWNvbXBvbmVudHMvdGVtcGxhdGUnO1xyXG5cclxuQE5nTW9kdWxlKHtcclxuICAgIGltcG9ydHM6IFtTaWRlYmFyQ29tcG9uZW50XSxcclxuICAgIGV4cG9ydHM6IFtTaWRlYmFyQ29tcG9uZW50LCBUZW1wbGF0ZU1vZHVsZV0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTaWRlYmFyTW9kdWxlIHt9XHJcbiJdfQ==
@@ -1,8 +0,0 @@
1
- import * as i0 from "@angular/core";
2
- import * as i1 from "./sidebar.component";
3
- import * as i2 from "@seniorsistemas/angular-components/template";
4
- export declare class SidebarModule {
5
- static ɵfac: i0.ɵɵFactoryDeclaration<SidebarModule, never>;
6
- static ɵmod: i0.ɵɵNgModuleDeclaration<SidebarModule, never, [typeof i1.SidebarComponent], [typeof i1.SidebarComponent, typeof i2.TemplateModule]>;
7
- static ɵinj: i0.ɵɵInjectorDeclaration<SidebarModule>;
8
- }