@flusys/ng-layout 1.0.0-beta → 1.0.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,19 +1,19 @@
1
1
  {
2
2
  "name": "@flusys/ng-layout",
3
- "version": "1.0.0-beta",
3
+ "version": "1.0.0",
4
4
  "description": "Layout components for FLUSYS Angular applications",
5
5
  "license": "MIT",
6
6
  "peerDependencies": {
7
- "@angular/common": "^21.0.0",
8
- "@angular/core": "^21.0.0",
9
- "@angular/router": "^21.0.0",
10
- "@flusys/ng-core": "^1.0.0-beta",
11
- "@flusys/ng-shared": "^1.0.0-beta",
12
- "@primeuix/themes": "^1.0.0",
13
- "primeicons": "^7.0.0",
14
- "primeng": "^21.0.0",
15
- "tailwindcss": "^4.0.0",
16
- "tailwindcss-primeui": "^0.6.0"
7
+ "@angular/common": ">=21.0.0",
8
+ "@angular/core": ">=21.0.0",
9
+ "@angular/router": ">=21.0.0",
10
+ "@flusys/ng-core": ">=1.0.0",
11
+ "@flusys/ng-shared": ">=1.0.0",
12
+ "@primeuix/themes": ">=1.0.0",
13
+ "primeicons": ">=7.0.0",
14
+ "primeng": ">=21.0.0",
15
+ "tailwindcss": ">=4.0.0",
16
+ "tailwindcss-primeui": ">=0.6.0"
17
17
  },
18
18
  "sideEffects": false,
19
19
  "module": "fesm2022/flusys-ng-layout.mjs",
@@ -2,10 +2,19 @@ import * as _angular_core from '@angular/core';
2
2
  import { Signal, InjectionToken } from '@angular/core';
3
3
  import * as rxjs from 'rxjs';
4
4
  import { Observable } from 'rxjs';
5
- import { IconTypeEnum, ILogicNode } from '@flusys/ng-shared';
5
+ import { ILogicNode, IconTypeEnum } from '@flusys/ng-shared';
6
6
  import * as _flusys_ng_layout from '@flusys/ng-layout';
7
7
  import * as _primeuix_themes_types from '@primeuix/themes/types';
8
8
 
9
+ declare class AppFooter {
10
+ private readonly layoutService;
11
+ readonly appName: string;
12
+ readonly authorName: string;
13
+ readonly authorUrl: string;
14
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AppFooter, never>;
15
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AppFooter, "app-footer", never, {}, {}, never, never, true, never>;
16
+ }
17
+
9
18
  interface ILauncherApp {
10
19
  id: string;
11
20
  name: string;
@@ -82,59 +91,46 @@ interface MenuChangeEvent {
82
91
  key: string;
83
92
  routeEvent?: boolean;
84
93
  }
85
- /**
86
- * User profile information for display in layout
87
- */
88
94
  interface UserProfile {
89
95
  id: string;
90
96
  name: string;
91
97
  email: string;
92
98
  profilePictureUrl?: string | null;
93
99
  }
94
- /**
95
- * Company information for display in layout
96
- */
97
100
  interface CompanyProfile {
98
101
  id: string;
99
102
  name: string;
100
103
  slug: string;
101
104
  logoUrl?: string | null;
102
105
  }
103
- /**
104
- * Service managing layout configuration and state.
105
- * Provides signals for reactive layout updates.
106
- */
106
+ /** Layout configuration and state management service */
107
107
  declare class LayoutService {
108
108
  private readonly document;
109
109
  private readonly platformId;
110
110
  private readonly isBrowser;
111
111
  private readonly persistence;
112
112
  private readonly appConfig;
113
- private readonly defaultConfig;
114
- private readonly initialConfig;
115
- private readonly defaultState;
116
- readonly layoutConfig: _angular_core.WritableSignal<LayoutConfig>;
117
- readonly layoutState: _angular_core.WritableSignal<LayoutState>;
118
- readonly transitionComplete: _angular_core.WritableSignal<boolean>;
119
- readonly userProfile: _angular_core.WritableSignal<UserProfile | null>;
120
- readonly companyProfile: _angular_core.WritableSignal<CompanyProfile | null>;
121
- readonly appName: _angular_core.WritableSignal<string>;
122
- readonly authorName: _angular_core.WritableSignal<string>;
123
- readonly authorUrl: _angular_core.WritableSignal<string>;
124
- private readonly _rawApps;
125
- /**
126
- * Filtered launcher apps based on user permissions.
127
- * Automatically recomputes when raw apps or permissions change.
128
- */
129
- readonly apps: _angular_core.Signal<ILauncherApp[]>;
113
+ private readonly DEFAULT_CONFIG;
114
+ private readonly DEFAULT_STATE;
115
+ private readonly _layoutConfig;
116
+ private readonly _layoutState;
117
+ private readonly _transitionComplete;
118
+ readonly layoutConfig: _angular_core.Signal<LayoutConfig>;
119
+ readonly layoutState: _angular_core.Signal<LayoutState>;
120
+ readonly transitionComplete: _angular_core.Signal<boolean>;
121
+ private readonly _userProfile;
122
+ private readonly _companyProfile;
130
123
  private readonly _rawMenu;
124
+ private readonly _rawApps;
131
125
  private readonly permissionValidator;
132
- /**
133
- * Filtered menu items based on user permissions.
134
- * Automatically recomputes when raw menu or permission checker changes.
135
- * Role checker is optional - if not set, role-based permissions will be denied.
136
- */
126
+ readonly userProfile: _angular_core.Signal<UserProfile | null>;
127
+ readonly companyProfile: _angular_core.Signal<CompanyProfile | null>;
128
+ readonly appName: string;
129
+ readonly authorName: string;
130
+ readonly authorUrl: string;
137
131
  readonly menu: _angular_core.Signal<IMenuItem[]>;
132
+ readonly apps: _angular_core.Signal<ILauncherApp[]>;
133
+ readonly hasApps: _angular_core.Signal<boolean>;
138
134
  readonly isSidebarActive: _angular_core.Signal<boolean | undefined>;
139
135
  readonly isDarkTheme: _angular_core.Signal<boolean | undefined>;
140
136
  readonly getPrimary: _angular_core.Signal<string | undefined>;
@@ -143,10 +139,9 @@ declare class LayoutService {
143
139
  readonly userName: _angular_core.Signal<string>;
144
140
  readonly userEmail: _angular_core.Signal<string>;
145
141
  readonly userProfilePictureUrl: _angular_core.Signal<string | null>;
146
- readonly companyName: _angular_core.Signal<string>;
147
142
  readonly companyLogoUrl: _angular_core.Signal<string | null>;
148
143
  readonly isAuthenticated: _angular_core.Signal<boolean>;
149
- readonly hasApps: _angular_core.Signal<boolean>;
144
+ readonly companyName: _angular_core.Signal<string>;
150
145
  private readonly configUpdate;
151
146
  private readonly overlayOpen;
152
147
  private readonly menuSource;
@@ -157,47 +152,21 @@ declare class LayoutService {
157
152
  readonly overlayOpen$: rxjs.Observable<void>;
158
153
  private initialized;
159
154
  constructor();
160
- private handleDarkModeTransition;
161
- private startViewTransition;
162
155
  toggleDarkMode(config?: LayoutConfig): void;
156
+ private handleDarkModeTransition;
163
157
  private onTransitionEnd;
164
158
  onMenuToggle(): void;
165
159
  isDesktop(): boolean;
166
160
  isMobile(): boolean;
167
- onConfigUpdate(): void;
168
161
  onMenuStateChange(event: MenuChangeEvent): void;
169
162
  reset(): void;
170
- /**
171
- * Set the current user profile for display in layout.
172
- * Called by auth integration to sync user data.
173
- */
163
+ updateLayoutConfig(config: Partial<LayoutConfig>): void;
164
+ updateLayoutState(state: Partial<LayoutState>): void;
174
165
  setUserProfile(profile: UserProfile | null): void;
175
- /**
176
- * Set the current company profile for display in layout.
177
- * Called by auth integration to sync company data.
178
- */
179
166
  setCompanyProfile(profile: CompanyProfile | null): void;
180
- /**
181
- * Set the raw menu items (unfiltered).
182
- * Menu will be automatically filtered based on permission checker.
183
- * Called by app initialization to set menu from IAM or other source.
184
- */
185
167
  setMenu(items: IMenuItem[]): void;
186
- /**
187
- * Clear menu and permission/role checkers.
188
- * Called on logout.
189
- */
190
168
  clearMenu(): void;
191
- /**
192
- * Set launcher apps for display in header.
193
- * Apps will be automatically filtered based on user permissions.
194
- * If empty after filtering, the app launcher button is hidden.
195
- */
196
169
  setApps(apps: ILauncherApp[]): void;
197
- /**
198
- * Clear launcher apps.
199
- * Called on logout.
200
- */
201
170
  clearApps(): void;
202
171
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<LayoutService, never>;
203
172
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<LayoutService>;
@@ -277,22 +246,20 @@ declare type SurfacesType = {
277
246
  };
278
247
  declare class AppConfigurator {
279
248
  private readonly router;
280
- private readonly primeng;
281
249
  readonly layoutService: LayoutService;
282
- private readonly platformService;
283
- presets: string[];
284
- showMenuModeButton: _angular_core.WritableSignal<boolean>;
285
- menuModeOptions: {
250
+ readonly presets: string[];
251
+ readonly showMenuModeButton: _angular_core.WritableSignal<boolean>;
252
+ readonly menuModeOptions: {
286
253
  label: string;
287
254
  value: string;
288
255
  }[];
289
- ngOnInit(): void;
290
- surfaces: SurfacesType[];
291
- selectedPrimaryColor: _angular_core.Signal<string | undefined>;
292
- selectedSurfaceColor: _angular_core.Signal<string | null | undefined>;
293
- selectedPreset: _angular_core.Signal<string | undefined>;
294
- menuMode: _angular_core.Signal<"static" | "overlay" | undefined>;
295
- primaryColors: _angular_core.Signal<SurfacesType[]>;
256
+ constructor();
257
+ readonly surfaces: SurfacesType[];
258
+ readonly selectedPrimaryColor: _angular_core.Signal<string | undefined>;
259
+ readonly selectedSurfaceColor: _angular_core.Signal<string | null | undefined>;
260
+ readonly selectedPreset: _angular_core.Signal<string | undefined>;
261
+ readonly menuMode: _angular_core.Signal<"static" | "overlay" | undefined>;
262
+ readonly primaryColors: _angular_core.Signal<SurfacesType[]>;
296
263
  getPresetExt(): {
297
264
  semantic: {
298
265
  primary: {
@@ -341,54 +308,22 @@ declare class AppConfigurator {
341
308
  };
342
309
  };
343
310
  };
344
- updateColors(event: any, type: string, color: any): void;
345
- applyTheme(type: string, color: any): void;
346
- onPresetChange(event: any): void;
311
+ updateColors(event: MouseEvent, type: string, color: SurfacesType): void;
312
+ applyTheme(type: string, color: SurfacesType): void;
313
+ onPresetChange(event: string): void;
347
314
  onMenuModeChange(event: 'static' | 'overlay'): void;
348
315
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AppConfigurator, never>;
349
316
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<AppConfigurator, "app-configurator", never, {}, {}, never, never, true, never>;
350
317
  }
351
318
 
352
319
  declare class AppFloatingConfigurator {
353
- LayoutService: LayoutService;
354
- isDarkTheme: _angular_core.Signal<boolean | undefined>;
320
+ private readonly layoutService;
321
+ readonly isDarkTheme: _angular_core.Signal<boolean | undefined>;
355
322
  toggleDarkMode(): void;
356
323
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AppFloatingConfigurator, never>;
357
324
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<AppFloatingConfigurator, "app-floating-configurator", never, {}, {}, never, never, true, never>;
358
325
  }
359
326
 
360
- declare class AppFooter {
361
- private readonly layoutService;
362
- readonly appName: _angular_core.WritableSignal<string>;
363
- readonly authorName: _angular_core.WritableSignal<string>;
364
- readonly authorUrl: _angular_core.WritableSignal<string>;
365
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AppFooter, never>;
366
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AppFooter, "app-footer", never, {}, {}, never, never, true, never>;
367
- }
368
-
369
- type ActivePanel = 'config' | null;
370
- declare class AppTopbar {
371
- private readonly appConfig;
372
- private readonly document;
373
- private readonly destroyRef;
374
- readonly layoutService: LayoutService;
375
- private readonly configContainer;
376
- readonly activePanel: _angular_core.WritableSignal<ActivePanel>;
377
- constructor();
378
- readonly companyName: _angular_core.Signal<string>;
379
- enableCompanyFeature: _angular_core.Signal<boolean>;
380
- toggleDarkMode(): void;
381
- togglePanel(panel: ActivePanel): void;
382
- private handleOutsideClick;
383
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AppTopbar, never>;
384
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AppTopbar, "app-topbar", never, {}, {}, never, never, true, never>;
385
- }
386
-
387
- declare class AppSidebar {
388
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AppSidebar, never>;
389
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AppSidebar, "app-sidebar", never, {}, {}, never, never, true, never>;
390
- }
391
-
392
327
  declare class AppLayout {
393
328
  private readonly destroyRef;
394
329
  private readonly document;
@@ -396,20 +331,18 @@ declare class AppLayout {
396
331
  private readonly renderer;
397
332
  private readonly router;
398
333
  private menuOutsideClickListener;
399
- appSidebar: AppSidebar;
400
- appTopBar: AppTopbar;
401
334
  constructor();
402
335
  isOutsideClicked(event: MouseEvent): boolean;
403
336
  hideMenu(): void;
404
337
  blockBodyScroll(): void;
405
338
  unblockBodyScroll(): void;
406
- get containerClass(): {
339
+ readonly containerClass: _angular_core.Signal<{
407
340
  'layout-overlay': boolean;
408
341
  'layout-static': boolean;
409
342
  'layout-static-inactive': boolean | undefined;
410
343
  'layout-overlay-active': boolean | undefined;
411
344
  'layout-mobile-active': boolean | undefined;
412
- };
345
+ }>;
413
346
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AppLayout, never>;
414
347
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<AppLayout, "app-layout", never, {}, {}, never, never, true, never>;
415
348
  }
@@ -432,15 +365,36 @@ declare class AppMenu {
432
365
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<AppMenu, "app-menu", never, {}, {}, never, never, true, never>;
433
366
  }
434
367
 
368
+ /**
369
+ * View Transitions API type definitions
370
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/View_Transitions_API
371
+ */
372
+ interface ViewTransition {
373
+ /** Promise fulfilled when the transition animation is complete */
374
+ finished: Promise<void>;
375
+ /** Promise fulfilled when the pseudo-element tree is ready */
376
+ ready: Promise<void>;
377
+ /** Promise fulfilled when the callback finishes */
378
+ updateCallbackDone: Promise<void>;
379
+ /** Skip the transition animation */
380
+ skipTransition(): void;
381
+ }
382
+ /**
383
+ * Extended Document interface with View Transitions API support.
384
+ * Uses the native Document type with startViewTransition which is now
385
+ * part of the standard TypeScript DOM library.
386
+ */
387
+ type DocumentWithViewTransition = Document;
388
+
435
389
  declare class AppMenuitem {
436
390
  readonly item: _angular_core.InputSignal<IMenuItem>;
437
391
  readonly index: _angular_core.InputSignal<number>;
438
392
  readonly parentKey: _angular_core.InputSignal<string>;
439
393
  private readonly router;
440
394
  private readonly layoutService;
441
- private readonly authState;
442
395
  private readonly destroyRef;
443
- readonly active: _angular_core.WritableSignal<boolean>;
396
+ private readonly _active;
397
+ readonly active: _angular_core.Signal<boolean>;
444
398
  readonly key: _angular_core.Signal<string>;
445
399
  readonly routerLink: _angular_core.Signal<string[]>;
446
400
  readonly routerLinkActiveOptions: _angular_core.Signal<{
@@ -456,6 +410,29 @@ declare class AppMenuitem {
456
410
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<AppMenuitem, "[app-menuitem]", never, { "item": { "alias": "item"; "required": true; "isSignal": true; }; "index": { "alias": "index"; "required": true; "isSignal": true; }; "parentKey": { "alias": "parentKey"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
457
411
  }
458
412
 
413
+ declare class AppSidebar {
414
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AppSidebar, never>;
415
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AppSidebar, "app-sidebar", never, {}, {}, never, never, true, never>;
416
+ }
417
+
418
+ type ActivePanel = 'config' | null;
419
+ declare class AppTopbar {
420
+ private readonly appConfig;
421
+ private readonly document;
422
+ private readonly destroyRef;
423
+ readonly layoutService: LayoutService;
424
+ private readonly configContainer;
425
+ readonly activePanel: _angular_core.WritableSignal<ActivePanel>;
426
+ constructor();
427
+ readonly companyName: _angular_core.Signal<string>;
428
+ readonly enableCompanyFeature: _angular_core.Signal<boolean>;
429
+ toggleDarkMode(): void;
430
+ togglePanel(panel: ActivePanel): void;
431
+ private handleOutsideClick;
432
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AppTopbar, never>;
433
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AppTopbar, "app-topbar", never, {}, {}, never, never, true, never>;
434
+ }
435
+
459
436
  /** Company/branch switcher displayed in top bar */
460
437
  declare class AppCompanyBranchSelector {
461
438
  private readonly destroyRef;
@@ -464,17 +441,25 @@ declare class AppCompanyBranchSelector {
464
441
  private readonly messageService;
465
442
  private readonly document;
466
443
  private readonly elementRef;
467
- readonly isActive: _angular_core.WritableSignal<boolean>;
444
+ private readonly _isActive;
445
+ readonly isActive: _angular_core.Signal<boolean>;
468
446
  constructor();
469
447
  readonly currentCompanyName: _angular_core.Signal<string>;
470
448
  readonly currentBranchName: _angular_core.Signal<string | null>;
471
- readonly companies: _angular_core.WritableSignal<ICompanyInfo[]>;
472
- readonly branches: _angular_core.WritableSignal<IBranchInfo[]>;
473
- readonly selectedCompanyId: _angular_core.WritableSignal<string | null>;
474
- readonly selectedBranchId: _angular_core.WritableSignal<string | null>;
475
- readonly isLoadingCompanies: _angular_core.WritableSignal<boolean>;
476
- readonly isLoadingBranches: _angular_core.WritableSignal<boolean>;
477
- readonly isSwitching: _angular_core.WritableSignal<boolean>;
449
+ private readonly _companies;
450
+ readonly companies: _angular_core.Signal<ICompanyInfo[]>;
451
+ private readonly _branches;
452
+ readonly branches: _angular_core.Signal<IBranchInfo[]>;
453
+ private readonly _selectedCompanyId;
454
+ readonly selectedCompanyId: _angular_core.Signal<string | null>;
455
+ private readonly _selectedBranchId;
456
+ readonly selectedBranchId: _angular_core.Signal<string | null>;
457
+ private readonly _isLoadingCompanies;
458
+ readonly isLoadingCompanies: _angular_core.Signal<boolean>;
459
+ private readonly _isLoadingBranches;
460
+ readonly isLoadingBranches: _angular_core.Signal<boolean>;
461
+ private readonly _isSwitching;
462
+ readonly isSwitching: _angular_core.Signal<boolean>;
478
463
  readonly canSwitch: _angular_core.Signal<boolean>;
479
464
  onPanelToggle(): void;
480
465
  private loadCompanies;
@@ -491,7 +476,8 @@ declare class AppLauncher {
491
476
  private readonly document;
492
477
  private readonly elementRef;
493
478
  readonly layoutService: LayoutService;
494
- readonly isActive: _angular_core.WritableSignal<boolean>;
479
+ private readonly _isActive;
480
+ readonly isActive: _angular_core.Signal<boolean>;
495
481
  constructor();
496
482
  togglePanel(): void;
497
483
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AppLauncher, never>;
@@ -502,15 +488,17 @@ declare class AppProfile {
502
488
  private readonly destroyRef;
503
489
  private readonly authState;
504
490
  private readonly authApi;
491
+ private readonly layoutService;
505
492
  private readonly messageService;
506
493
  private readonly document;
507
494
  private readonly elementRef;
508
- readonly isActive: _angular_core.WritableSignal<boolean>;
495
+ private readonly _isActive;
496
+ readonly isActive: _angular_core.Signal<boolean>;
509
497
  constructor();
510
498
  togglePanel(): void;
511
- userName: _angular_core.Signal<string>;
512
- userEmail: _angular_core.Signal<string>;
513
- profilePicture: _angular_core.Signal<string>;
499
+ readonly userName: _angular_core.Signal<string>;
500
+ readonly userEmail: _angular_core.Signal<string>;
501
+ readonly profilePicture: _angular_core.Signal<string>;
514
502
  logout(): void;
515
503
  copySignUpLink(): void;
516
504
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AppProfile, never>;
@@ -538,9 +526,9 @@ declare function filterAppsByPermissions(apps: ILauncherApp[], permissionCodes:
538
526
  */
539
527
  declare function filterMenuByPermissions(items: IMenuItem[], permissionCode: string[]): IMenuItem[];
540
528
 
541
- declare const GreenTheme: _primeuix_themes_types.Preset;
542
-
543
529
  declare const NavyBlueTheme: _primeuix_themes_types.Preset;
544
530
 
531
+ declare const GreenTheme: _primeuix_themes_types.Preset;
532
+
545
533
  export { AppCompanyBranchSelector, AppConfigurator, AppFloatingConfigurator, AppFooter, AppLauncher, AppLayout, AppMenu, AppMenuitem, AppProfile, AppSidebar, AppTopbar, GreenTheme, LAYOUT_AUTH_API, LAYOUT_AUTH_STATE, LayoutPersistenceService, LayoutService, NavyBlueTheme, filterAppsByPermissions, filterMenuByPermissions };
546
- export type { CompanyProfile, IBranchInfo, ICompanyInfo, ILauncherApp, ILayoutAuthApi, ILayoutAuthState, IMenuItem, IUserInfo, LayoutConfig, LayoutState, MenuChangeEvent, UserProfile };
534
+ export type { CompanyProfile, DocumentWithViewTransition, IBranchInfo, ICompanyInfo, ILauncherApp, ILayoutAuthApi, ILayoutAuthState, IMenuItem, IUserInfo, LayoutConfig, LayoutState, MenuChangeEvent, UserProfile, ViewTransition };