@acorex-platform/module-auth-client 0.0.38 → 0.0.48

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 (107) hide show
  1. package/fesm2022/acorex-platform-module-auth-client-accept-invitation.component-Ct28GG3a.mjs +179 -0
  2. package/fesm2022/acorex-platform-module-auth-client-accept-invitation.component-Ct28GG3a.mjs.map +1 -0
  3. package/fesm2022/{acorex-platform-module-auth-client-acorex-platform-module-auth-client-CRl74b8g.mjs → acorex-platform-module-auth-client-acorex-platform-module-auth-client-C1oSPf12.mjs} +1154 -107
  4. package/fesm2022/acorex-platform-module-auth-client-acorex-platform-module-auth-client-C1oSPf12.mjs.map +1 -0
  5. package/fesm2022/{acorex-platform-module-auth-client-app-chooser.component-CjWofUGR.mjs → acorex-platform-module-auth-client-app-chooser.component-CLKLwWW8.mjs} +4 -4
  6. package/fesm2022/{acorex-platform-module-auth-client-app-chooser.component-CjWofUGR.mjs.map → acorex-platform-module-auth-client-app-chooser.component-CLKLwWW8.mjs.map} +1 -1
  7. package/fesm2022/{acorex-platform-module-auth-client-blank.layout-BCXNPgrp.mjs → acorex-platform-module-auth-client-blank.layout-xSXPWxyw.mjs} +3 -3
  8. package/fesm2022/acorex-platform-module-auth-client-blank.layout-xSXPWxyw.mjs.map +1 -0
  9. package/fesm2022/{acorex-platform-module-auth-client-change-password.command-BqU3jYV9.mjs → acorex-platform-module-auth-client-change-password.command-CknYaMZD.mjs} +2 -2
  10. package/fesm2022/{acorex-platform-module-auth-client-change-password.command-BqU3jYV9.mjs.map → acorex-platform-module-auth-client-change-password.command-CknYaMZD.mjs.map} +1 -1
  11. package/fesm2022/{acorex-platform-module-auth-client-change-photo.command-CzO3A7OG.mjs → acorex-platform-module-auth-client-change-photo.command-CML784Lg.mjs} +71 -21
  12. package/fesm2022/acorex-platform-module-auth-client-change-photo.command-CML784Lg.mjs.map +1 -0
  13. package/fesm2022/acorex-platform-module-auth-client-command-return-url.util-mBmtJ7T2.mjs +69 -0
  14. package/fesm2022/acorex-platform-module-auth-client-command-return-url.util-mBmtJ7T2.mjs.map +1 -0
  15. package/fesm2022/acorex-platform-module-auth-client-contracts.mjs +12 -7
  16. package/fesm2022/acorex-platform-module-auth-client-contracts.mjs.map +1 -1
  17. package/fesm2022/{acorex-platform-module-auth-client-edit-account-info.command-CD9IrimO.mjs → acorex-platform-module-auth-client-edit-account-info.command-DulLUfWs.mjs} +25 -4
  18. package/fesm2022/acorex-platform-module-auth-client-edit-account-info.command-DulLUfWs.mjs.map +1 -0
  19. package/fesm2022/{acorex-platform-module-auth-client-get-user-activity.query-B1bKcSVQ.mjs → acorex-platform-module-auth-client-get-user-activity.query-CV9mdOBi.mjs} +2 -2
  20. package/fesm2022/{acorex-platform-module-auth-client-get-user-activity.query-B1bKcSVQ.mjs.map → acorex-platform-module-auth-client-get-user-activity.query-CV9mdOBi.mjs.map} +1 -1
  21. package/fesm2022/{acorex-platform-module-auth-client-lock-screen.command-DKtlBzS7.mjs → acorex-platform-module-auth-client-lock-screen.command-BH3Q6lJE.mjs} +2 -2
  22. package/fesm2022/{acorex-platform-module-auth-client-lock-screen.command-DKtlBzS7.mjs.map → acorex-platform-module-auth-client-lock-screen.command-BH3Q6lJE.mjs.map} +1 -1
  23. package/fesm2022/{acorex-platform-module-auth-client-login.module-CXl61yOu.mjs → acorex-platform-module-auth-client-login.module-DtvnPpBH.mjs} +3 -3
  24. package/fesm2022/{acorex-platform-module-auth-client-login.module-CXl61yOu.mjs.map → acorex-platform-module-auth-client-login.module-DtvnPpBH.mjs.map} +1 -1
  25. package/fesm2022/acorex-platform-module-auth-client-manage-two-factor.command-BAg2W20W.mjs +445 -0
  26. package/fesm2022/acorex-platform-module-auth-client-manage-two-factor.command-BAg2W20W.mjs.map +1 -0
  27. package/fesm2022/{acorex-platform-module-auth-client-master.layout-D7zUm7aL.mjs → acorex-platform-module-auth-client-master.layout-B3krDskY.mjs} +5 -5
  28. package/fesm2022/{acorex-platform-module-auth-client-master.layout-D7zUm7aL.mjs.map → acorex-platform-module-auth-client-master.layout-B3krDskY.mjs.map} +1 -1
  29. package/fesm2022/{acorex-platform-module-auth-client-oauth-callback.component-fdWC08nA.mjs → acorex-platform-module-auth-client-oauth-callback.component-DWnljN18.mjs} +3 -3
  30. package/fesm2022/{acorex-platform-module-auth-client-oauth-callback.component-fdWC08nA.mjs.map → acorex-platform-module-auth-client-oauth-callback.component-DWnljN18.mjs.map} +1 -1
  31. package/fesm2022/{acorex-platform-module-auth-client-open-sessions.command-DKvyMkhl.mjs → acorex-platform-module-auth-client-open-sessions.command-CEpu6c7D.mjs} +6 -6
  32. package/fesm2022/{acorex-platform-module-auth-client-open-sessions.command-DKvyMkhl.mjs.map → acorex-platform-module-auth-client-open-sessions.command-CEpu6c7D.mjs.map} +1 -1
  33. package/fesm2022/acorex-platform-module-auth-client-open-waiting-room.command-CR-_ppYd.mjs +28 -0
  34. package/fesm2022/acorex-platform-module-auth-client-open-waiting-room.command-CR-_ppYd.mjs.map +1 -0
  35. package/fesm2022/{acorex-platform-module-auth-client-password.component-BE2JkYm_.mjs → acorex-platform-module-auth-client-password.component-Ci5Wy3rO.mjs} +5 -5
  36. package/fesm2022/{acorex-platform-module-auth-client-password.component-BE2JkYm_.mjs.map → acorex-platform-module-auth-client-password.component-Ci5Wy3rO.mjs.map} +1 -1
  37. package/fesm2022/{acorex-platform-module-auth-client-password.component-BoWDVby5.mjs → acorex-platform-module-auth-client-password.component-ddh-_0k3.mjs} +39 -9
  38. package/fesm2022/acorex-platform-module-auth-client-password.component-ddh-_0k3.mjs.map +1 -0
  39. package/fesm2022/{acorex-platform-module-auth-client-platform-settings-unavailable.component-BJMtsa99.mjs → acorex-platform-module-auth-client-platform-settings-unavailable.component-LwuokJiZ.mjs} +4 -4
  40. package/fesm2022/{acorex-platform-module-auth-client-platform-settings-unavailable.component-BJMtsa99.mjs.map → acorex-platform-module-auth-client-platform-settings-unavailable.component-LwuokJiZ.mjs.map} +1 -1
  41. package/fesm2022/{acorex-platform-module-auth-client-profile-activity-chart.component-CFaRGMKu.mjs → acorex-platform-module-auth-client-profile-activity-chart.component-D4bqeKCd.mjs} +5 -5
  42. package/fesm2022/{acorex-platform-module-auth-client-profile-activity-chart.component-CFaRGMKu.mjs.map → acorex-platform-module-auth-client-profile-activity-chart.component-D4bqeKCd.mjs.map} +1 -1
  43. package/fesm2022/{acorex-platform-module-auth-client-profile-delete-account-danger-zone.component-Dx2-o9XL.mjs → acorex-platform-module-auth-client-profile-delete-account-danger-zone.component-DWNbDzDd.mjs} +4 -4
  44. package/fesm2022/{acorex-platform-module-auth-client-profile-delete-account-danger-zone.component-Dx2-o9XL.mjs.map → acorex-platform-module-auth-client-profile-delete-account-danger-zone.component-DWNbDzDd.mjs.map} +1 -1
  45. package/fesm2022/{acorex-platform-module-auth-client-profile-page-component.provider-1Spuexhb.mjs → acorex-platform-module-auth-client-profile-page-component.provider-DLTbTEe6.mjs} +4 -4
  46. package/fesm2022/{acorex-platform-module-auth-client-profile-page-component.provider-1Spuexhb.mjs.map → acorex-platform-module-auth-client-profile-page-component.provider-DLTbTEe6.mjs.map} +1 -1
  47. package/fesm2022/{acorex-platform-module-auth-client-profile-page.component-CGs24n0j.mjs → acorex-platform-module-auth-client-profile-page.component-BhmMsO3g.mjs} +9 -7
  48. package/fesm2022/acorex-platform-module-auth-client-profile-page.component-BhmMsO3g.mjs.map +1 -0
  49. package/fesm2022/acorex-platform-module-auth-client-pwa-install.component-BJOvT0hW.mjs +84 -0
  50. package/fesm2022/acorex-platform-module-auth-client-pwa-install.component-BJOvT0hW.mjs.map +1 -0
  51. package/fesm2022/{acorex-platform-module-auth-client-register-password.component-BlOn9609.mjs → acorex-platform-module-auth-client-register-password.component-M-ayP7oO.mjs} +7 -7
  52. package/fesm2022/{acorex-platform-module-auth-client-register-password.component-BlOn9609.mjs.map → acorex-platform-module-auth-client-register-password.component-M-ayP7oO.mjs.map} +1 -1
  53. package/fesm2022/{acorex-platform-module-auth-client-register.module-CpoYf5uG.mjs → acorex-platform-module-auth-client-register.module-Qa3ovje0.mjs} +4 -4
  54. package/fesm2022/{acorex-platform-module-auth-client-register.module-CpoYf5uG.mjs.map → acorex-platform-module-auth-client-register.module-Qa3ovje0.mjs.map} +1 -1
  55. package/fesm2022/{acorex-platform-module-auth-client-remove-pin-code.command-Da7ryul6.mjs → acorex-platform-module-auth-client-remove-pin-code.command-BenNCyt6.mjs} +2 -2
  56. package/fesm2022/{acorex-platform-module-auth-client-remove-pin-code.command-Da7ryul6.mjs.map → acorex-platform-module-auth-client-remove-pin-code.command-BenNCyt6.mjs.map} +1 -1
  57. package/fesm2022/{acorex-platform-module-auth-client-reset-password.component-D0nxlhJm.mjs → acorex-platform-module-auth-client-reset-password.component-BQfKSqpW.mjs} +6 -6
  58. package/fesm2022/{acorex-platform-module-auth-client-reset-password.component-D0nxlhJm.mjs.map → acorex-platform-module-auth-client-reset-password.component-BQfKSqpW.mjs.map} +1 -1
  59. package/fesm2022/{acorex-platform-module-auth-client-result.component-Bo1QkwMu.mjs → acorex-platform-module-auth-client-result.component-PhPaEAgh.mjs} +3 -3
  60. package/fesm2022/{acorex-platform-module-auth-client-result.component-Bo1QkwMu.mjs.map → acorex-platform-module-auth-client-result.component-PhPaEAgh.mjs.map} +1 -1
  61. package/fesm2022/acorex-platform-module-auth-client-routes-90eFjxx8.mjs +17 -0
  62. package/fesm2022/acorex-platform-module-auth-client-routes-90eFjxx8.mjs.map +1 -0
  63. package/fesm2022/{acorex-platform-module-auth-client-session-limit.component-DH58dRba.mjs → acorex-platform-module-auth-client-session-limit.component-Dc6TIn-2.mjs} +3 -3
  64. package/fesm2022/{acorex-platform-module-auth-client-session-limit.component-DH58dRba.mjs.map → acorex-platform-module-auth-client-session-limit.component-Dc6TIn-2.mjs.map} +1 -1
  65. package/fesm2022/{acorex-platform-module-auth-client-session-lock-overlay.component-cDCrwNRV.mjs → acorex-platform-module-auth-client-session-lock-overlay.component-ChigSAI-.mjs} +7 -7
  66. package/fesm2022/{acorex-platform-module-auth-client-session-lock-overlay.component-cDCrwNRV.mjs.map → acorex-platform-module-auth-client-session-lock-overlay.component-ChigSAI-.mjs.map} +1 -1
  67. package/fesm2022/{acorex-platform-module-auth-client-set-pin-code.command-FjM1kzUj.mjs → acorex-platform-module-auth-client-set-pin-code.command-CefSbJz8.mjs} +3 -3
  68. package/fesm2022/{acorex-platform-module-auth-client-set-pin-code.command-FjM1kzUj.mjs.map → acorex-platform-module-auth-client-set-pin-code.command-CefSbJz8.mjs.map} +1 -1
  69. package/fesm2022/{acorex-platform-module-auth-client-set-pin-code.component-BgEgdFxQ.mjs → acorex-platform-module-auth-client-set-pin-code.component-DqFW_4rM.mjs} +6 -6
  70. package/fesm2022/{acorex-platform-module-auth-client-set-pin-code.component-BgEgdFxQ.mjs.map → acorex-platform-module-auth-client-set-pin-code.component-DqFW_4rM.mjs.map} +1 -1
  71. package/fesm2022/{acorex-platform-module-auth-client-settings.provider-DGiK-MmW.mjs → acorex-platform-module-auth-client-settings.provider-DsKsZrOC.mjs} +18 -13
  72. package/fesm2022/acorex-platform-module-auth-client-settings.provider-DsKsZrOC.mjs.map +1 -0
  73. package/fesm2022/{acorex-platform-module-auth-client-signout-command-B7n_Fn4P.mjs → acorex-platform-module-auth-client-signout-command-D4Qgv7q2.mjs} +7 -1
  74. package/fesm2022/acorex-platform-module-auth-client-signout-command-D4Qgv7q2.mjs.map +1 -0
  75. package/fesm2022/{acorex-platform-module-auth-client-tenant-chooser.component-B8CNqHx5.mjs → acorex-platform-module-auth-client-tenant-chooser.component-DCdRCf1m.mjs} +5 -5
  76. package/fesm2022/{acorex-platform-module-auth-client-tenant-chooser.component-B8CNqHx5.mjs.map → acorex-platform-module-auth-client-tenant-chooser.component-DCdRCf1m.mjs.map} +1 -1
  77. package/fesm2022/acorex-platform-module-auth-client-two-factor-challenge.storage-mi0UD7Sc.mjs +48 -0
  78. package/fesm2022/acorex-platform-module-auth-client-two-factor-challenge.storage-mi0UD7Sc.mjs.map +1 -0
  79. package/fesm2022/acorex-platform-module-auth-client-two-factor-code.component-CtSv3MQu.mjs +200 -0
  80. package/fesm2022/acorex-platform-module-auth-client-two-factor-code.component-CtSv3MQu.mjs.map +1 -0
  81. package/fesm2022/{acorex-platform-module-auth-client-two-factor.module-CI8KC5M_.mjs → acorex-platform-module-auth-client-two-factor.module-B7tETPbq.mjs} +10 -5
  82. package/fesm2022/acorex-platform-module-auth-client-two-factor.module-B7tETPbq.mjs.map +1 -0
  83. package/fesm2022/{acorex-platform-module-auth-client-view-login-history.command-Cqb27L-l.mjs → acorex-platform-module-auth-client-view-login-history.command-CKPbyVWd.mjs} +2 -2
  84. package/fesm2022/{acorex-platform-module-auth-client-view-login-history.command-Cqb27L-l.mjs.map → acorex-platform-module-auth-client-view-login-history.command-CKPbyVWd.mjs.map} +1 -1
  85. package/fesm2022/acorex-platform-module-auth-client-waiting-room.component-IAVIt1fY.mjs +165 -0
  86. package/fesm2022/acorex-platform-module-auth-client-waiting-room.component-IAVIt1fY.mjs.map +1 -0
  87. package/fesm2022/acorex-platform-module-auth-client-welcome-onboarding-page.component-C2WYgv4l.mjs +813 -0
  88. package/fesm2022/acorex-platform-module-auth-client-welcome-onboarding-page.component-C2WYgv4l.mjs.map +1 -0
  89. package/fesm2022/acorex-platform-module-auth-client-welcome-onboarding.command-Ck1A26BI.mjs +59 -0
  90. package/fesm2022/acorex-platform-module-auth-client-welcome-onboarding.command-Ck1A26BI.mjs.map +1 -0
  91. package/fesm2022/acorex-platform-module-auth-client.mjs +1 -1
  92. package/package.json +2 -2
  93. package/types/acorex-platform-module-auth-client-contracts.d.ts +13 -3
  94. package/types/acorex-platform-module-auth-client.d.ts +60 -2
  95. package/fesm2022/acorex-platform-module-auth-client-acorex-platform-module-auth-client-CRl74b8g.mjs.map +0 -1
  96. package/fesm2022/acorex-platform-module-auth-client-blank.layout-BCXNPgrp.mjs.map +0 -1
  97. package/fesm2022/acorex-platform-module-auth-client-change-photo.command-CzO3A7OG.mjs.map +0 -1
  98. package/fesm2022/acorex-platform-module-auth-client-edit-account-info.command-CD9IrimO.mjs.map +0 -1
  99. package/fesm2022/acorex-platform-module-auth-client-password.component-BoWDVby5.mjs.map +0 -1
  100. package/fesm2022/acorex-platform-module-auth-client-profile-page.component-CGs24n0j.mjs.map +0 -1
  101. package/fesm2022/acorex-platform-module-auth-client-routes-B6iJHJ60.mjs +0 -13
  102. package/fesm2022/acorex-platform-module-auth-client-routes-B6iJHJ60.mjs.map +0 -1
  103. package/fesm2022/acorex-platform-module-auth-client-settings.provider-DGiK-MmW.mjs.map +0 -1
  104. package/fesm2022/acorex-platform-module-auth-client-signout-command-B7n_Fn4P.mjs.map +0 -1
  105. package/fesm2022/acorex-platform-module-auth-client-two-factor-code.component-BrqfaY8i.mjs +0 -40
  106. package/fesm2022/acorex-platform-module-auth-client-two-factor-code.component-BrqfaY8i.mjs.map +0 -1
  107. package/fesm2022/acorex-platform-module-auth-client-two-factor.module-CI8KC5M_.mjs.map +0 -1
@@ -1,30 +1,30 @@
1
1
  import * as i1$4 from '@acorex-platform/framework-client/common';
2
- import { AXPFileStorageService, AXPHomePageService, AXPPlatformSettingsLoadState, AXPSettingsService, AXPDataProvider, AXPCommonSettings, AXP_PROTECTED_ROUTE_GUARDS, AXPCommonModule, AXPPlatformSettingsOfflineBootstrapService, AXP_MENU_PROVIDER, AXP_SETTING_DEFINITION_PROVIDER } from '@acorex-platform/framework-client/common';
2
+ import { AXPFileStorageService, AXPHomePageService, AXPPlatformSettingsLoadState, AXPSettingsService, AXPDataProvider, AXPCommonSettings, AXPSettingDefinitionProviderService, AXP_PROTECTED_ROUTE_GUARDS, AXPCommonModule, AXPPlatformSettingsOfflineBootstrapService, AXP_MENU_PROVIDER, AXP_SETTING_DEFINITION_PROVIDER } from '@acorex-platform/framework-client/common';
3
3
  import { AXPSessionService, AXPUnauthorizedError, AXPUnauthenticatedError, AXPAuthStrategyRegistryService, storeSessionLimitPendingTenant, isMaxActiveDeviceSessionsError, traceAuthGuard, AXPAuthGuard, AXPSessionStatus } from '@acorex-platform/framework-client/auth';
4
4
  import { AXPUserAvatarService, AXPUserAvatarComponent, AXP_PAGE_COMPONENT_PROVIDER } from '@acorex-platform/framework-client/layout/components';
5
- import { AXPFileStorageStatus, coerceUnknownToTrimmedString, AXPPlatformScope, AXPKeyboardShortcutPriority, verifyPassword } from '@acorex-platform/framework-shared/core';
6
- import { RootConfig, AXMSessionStatusTypes, AXPSecurityManagementFeatureKeys } from '@acorex-platform/module-security-management-client/contracts';
5
+ import { AXPFileStorageStatus, coerceUnknownToTrimmedString, AXPPlatformScope, AXPKeyboardShortcutPriority, AXPRegionalSetting, verifyPassword, runtimeCommandPayloadData } from '@acorex-platform/framework-shared/core';
6
+ import { RootConfig, AXMSessionStatusTypes, AXPSecurityManagementFeatureKeys, AXMSecurityManagementServerCommands } from '@acorex-platform/module-security-management-client/contracts';
7
7
  import { AXPEntityService, AXP_ENTITY_STORAGE_MIDDLEWARE } from '@acorex-platform/framework-client/layout/entity';
8
8
  import * as i0 from '@angular/core';
9
9
  import { inject, Injectable, isDevMode, InjectionToken, NgModule, input, output, viewChild, viewChildren, signal, computed, effect, ChangeDetectionStrategy, Component, Input, DestroyRef, ViewEncapsulation, ViewChild, Injector, afterNextRender, NgZone, ApplicationRef } from '@angular/core';
10
- import { AXPLayoutThemeService, AXPMenuVerticalMode } from '@acorex-platform/framework-client/themes/shared';
10
+ import { AXPLayoutThemeService, AXPMenuVerticalMode, AXPThemeLayoutSetting } from '@acorex-platform/framework-client/themes/shared';
11
11
  import { HttpErrorResponse } from '@angular/common/http';
12
- import * as i1$5 from '@angular/router';
12
+ import * as i6$1 from '@angular/router';
13
13
  import { Router, RouterModule, ROUTES, NavigationStart } from '@angular/router';
14
14
  import { AXPAuthCredentialTypeOptions, AXP_AUTH_SIGN_IN_PAGE_SLOGAN_DEFAULT, AXP_AUTH_SIGN_IN_PAGE_DESCRIPTION_DEFAULT, AXPAuthSettings, AXMAuthCommandKeys } from '@acorex-platform/module-auth-client/contracts';
15
15
  import * as i1 from '@acorex/core/validation';
16
16
  import { AXValidationModule } from '@acorex/core/validation';
17
17
  import { isNil, isString, orderBy, isEmpty, get, defaultTo } from 'lodash';
18
18
  import * as i1$3 from '@acorex-platform/framework-client/core';
19
- import { axpApplicationLogoKey, AXPEntityLogoRegistrationService, AXPLogoComponent, axpTenantLogoKey, AXPHookService, AXPKeyboardShortcutRegistry, chordToKbdItemKeys, getPrimaryKeyboardShortcutChord, normalizeKeyboardShortcuts, AXPDeviceService, AXPComponentSlotModule, AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER, provideAppStartUpTask, AXP_APP_STARTUP_PRIORITY, provideLazyProvider, AXPComponentSlotDirective } from '@acorex-platform/framework-client/core';
19
+ import { axpApplicationLogoKey, AXPEntityLogoRegistrationService, AXPLogoComponent, axpTenantLogoKey, AXPHookService, AXPKeyboardShortcutRegistry, AXPDeviceService, chordToKbdItemKeys, getPrimaryKeyboardShortcutChord, normalizeKeyboardShortcuts, AXPComponentSlotModule, AXPAppStartUpService, AXP_APP_STARTUP_PRIORITY, AXP_HOOK_PROVIDER, provideAppStartUpTask, provideLazyProvider, AXPComponentSlotDirective } from '@acorex-platform/framework-client/core';
20
20
  import { AXPCommandService, provideQuerySetups, provideCommandSetups } from '@acorex-platform/framework-client/runtime';
21
21
  import { AXPRootLayoutComponent } from '@acorex-platform/framework-client/themes/default';
22
- import * as i5 from '@angular/common';
22
+ import * as i3$1 from '@angular/common';
23
23
  import { CommonModule, AsyncPipe, Location } from '@angular/common';
24
24
  import { first, filter, firstValueFrom, take, combineLatest, distinctUntilChanged, switchMap, EMPTY, from, timeout } from 'rxjs';
25
25
  import * as i1$1 from '@acorex/components/button';
26
26
  import { AXButtonModule } from '@acorex/components/button';
27
- import * as i3$1 from '@acorex/components/decorators';
27
+ import * as i2$2 from '@acorex/components/decorators';
28
28
  import { AXDecoratorModule } from '@acorex/components/decorators';
29
29
  import * as i2$1 from '@acorex/components/popover';
30
30
  import { AXPopoverModule } from '@acorex/components/popover';
@@ -36,7 +36,7 @@ import * as i2 from '@acorex/components/loading';
36
36
  import { AXLoadingModule } from '@acorex/components/loading';
37
37
  import * as i3 from '@acorex/components/skeleton';
38
38
  import { AXSkeletonModule } from '@acorex/components/skeleton';
39
- import * as i5$1 from '@acorex/core/translation';
39
+ import * as i5 from '@acorex/core/translation';
40
40
  import { AXTranslationModule, AXTranslationService, resolveMultiLanguageString } from '@acorex/core/translation';
41
41
  import { AXAvatarModule } from '@acorex/components/avatar';
42
42
  import { AXImageModule } from '@acorex/components/image';
@@ -46,6 +46,7 @@ import { AXSearchBoxModule } from '@acorex/components/search-box';
46
46
  import * as i1$2 from '@angular/forms';
47
47
  import { FormsModule } from '@angular/forms';
48
48
  import { AXToastService } from '@acorex/components/toast';
49
+ import { AXPLayoutBuilderService } from '@acorex-platform/framework-client/layout/builder';
49
50
  import { AXOverlayService } from '@acorex/cdk/overlay';
50
51
  import { AXPlatform } from '@acorex/core/platform';
51
52
  import { PRESENCE_SET_AVAILABILITY } from '@acorex-platform/framework-shared/runtime';
@@ -990,36 +991,46 @@ const routes = [
990
991
  },
991
992
  {
992
993
  path: 'unavailable',
993
- loadComponent: () => import('./acorex-platform-module-auth-client-platform-settings-unavailable.component-BJMtsa99.mjs').then((c) => c.AXMPlatformSettingsUnavailableComponent),
994
+ loadComponent: () => import('./acorex-platform-module-auth-client-platform-settings-unavailable.component-LwuokJiZ.mjs').then((c) => c.AXMPlatformSettingsUnavailableComponent),
994
995
  },
995
996
  {
996
997
  path: '',
997
- loadComponent: () => import('./acorex-platform-module-auth-client-master.layout-D7zUm7aL.mjs').then((c) => c.AXPAuthMasterLayoutComponent),
998
- loadChildren: () => import('./acorex-platform-module-auth-client-login.module-CXl61yOu.mjs').then((c) => c.AXPSignInModule),
998
+ loadComponent: () => import('./acorex-platform-module-auth-client-master.layout-B3krDskY.mjs').then((c) => c.AXPAuthMasterLayoutComponent),
999
+ children: [
1000
+ {
1001
+ path: 'install',
1002
+ loadComponent: () => import('./acorex-platform-module-auth-client-pwa-install.component-BJOvT0hW.mjs').then((c) => c.AXMPwaInstallComponent),
1003
+ },
1004
+ ],
999
1005
  },
1000
1006
  {
1001
1007
  path: '',
1002
- loadComponent: () => import('./acorex-platform-module-auth-client-master.layout-D7zUm7aL.mjs').then((c) => c.AXPAuthMasterLayoutComponent),
1003
- loadChildren: () => import('./acorex-platform-module-auth-client-two-factor.module-CI8KC5M_.mjs').then((c) => c.AXPTwoFactorModule),
1008
+ loadComponent: () => import('./acorex-platform-module-auth-client-master.layout-B3krDskY.mjs').then((c) => c.AXPAuthMasterLayoutComponent),
1009
+ loadChildren: () => import('./acorex-platform-module-auth-client-login.module-DtvnPpBH.mjs').then((c) => c.AXPSignInModule),
1004
1010
  },
1005
1011
  {
1006
1012
  path: '',
1007
- loadComponent: () => import('./acorex-platform-module-auth-client-master.layout-D7zUm7aL.mjs').then((c) => c.AXPAuthMasterLayoutComponent),
1008
- loadChildren: () => import('./acorex-platform-module-auth-client-routes-B6iJHJ60.mjs').then((c) => c),
1013
+ loadComponent: () => import('./acorex-platform-module-auth-client-master.layout-B3krDskY.mjs').then((c) => c.AXPAuthMasterLayoutComponent),
1014
+ loadChildren: () => import('./acorex-platform-module-auth-client-two-factor.module-B7tETPbq.mjs').then((c) => c.AXPTwoFactorModule),
1015
+ },
1016
+ {
1017
+ path: '',
1018
+ loadComponent: () => import('./acorex-platform-module-auth-client-master.layout-B3krDskY.mjs').then((c) => c.AXPAuthMasterLayoutComponent),
1019
+ loadChildren: () => import('./acorex-platform-module-auth-client-routes-90eFjxx8.mjs').then((c) => c),
1009
1020
  },
1010
1021
  {
1011
1022
  path: 'oauth-callback',
1012
- loadComponent: () => import('./acorex-platform-module-auth-client-oauth-callback.component-fdWC08nA.mjs').then((c) => c.AXPOAuthCallbackComponent),
1023
+ loadComponent: () => import('./acorex-platform-module-auth-client-oauth-callback.component-DWnljN18.mjs').then((c) => c.AXPOAuthCallbackComponent),
1013
1024
  },
1014
1025
  {
1015
1026
  path: 'account',
1016
- loadComponent: () => import('./acorex-platform-module-auth-client-blank.layout-BCXNPgrp.mjs').then((c) => c.AXPAuthBlankLayoutComponent),
1027
+ loadComponent: () => import('./acorex-platform-module-auth-client-blank.layout-xSXPWxyw.mjs').then((c) => c.AXPAuthBlankLayoutComponent),
1017
1028
  loadChildren: () => Promise.resolve().then(function () { return account_module; }).then((c) => c.AXPAccountModule),
1018
1029
  },
1019
1030
  {
1020
1031
  path: '',
1021
- loadComponent: () => import('./acorex-platform-module-auth-client-master.layout-D7zUm7aL.mjs').then((c) => c.AXPAuthMasterLayoutComponent),
1022
- loadChildren: () => import('./acorex-platform-module-auth-client-register.module-CpoYf5uG.mjs').then((c) => c.AXPRegisterModule),
1032
+ loadComponent: () => import('./acorex-platform-module-auth-client-master.layout-B3krDskY.mjs').then((c) => c.AXPAuthMasterLayoutComponent),
1033
+ loadChildren: () => import('./acorex-platform-module-auth-client-register.module-Qa3ovje0.mjs').then((c) => c.AXPRegisterModule),
1023
1034
  },
1024
1035
  ],
1025
1036
  },
@@ -1202,7 +1213,7 @@ class AXPAppChooserListComponent {
1202
1213
  }
1203
1214
  }
1204
1215
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPAppChooserListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1205
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPAppChooserListComponent, isStandalone: true, selector: "axp-app-chooser-list", inputs: { simple: { classPropertyName: "simple", publicName: "simple", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { applicationChosen: "applicationChosen", loadingChange: "loadingChange" }, viewQueries: [{ propertyName: "listNav", first: true, predicate: AXListNavigationDirective, descendants: true, isSignal: true }, { propertyName: "listItems", predicate: AXListNavigationItemDirective, descendants: true, isSignal: true }], ngImport: i0, template: "@if (isLoading()) {\n <div class=\"w-full flex flex-col gap-3\">\n @for (item of skeletonItems; track item) {\n <div class=\"flex gap-3 items-center p-2\">\n <ax-skeleton [animated]=\"true\" class=\"size-10 rounded-lg shrink-0\"></ax-skeleton>\n <ax-skeleton [animated]=\"true\" class=\"flex-1 h-5 rounded-md\"></ax-skeleton>\n <ax-skeleton [animated]=\"true\" class=\"w-16 h-4 rounded-md shrink-0\"></ax-skeleton>\n </div>\n }\n </div>\n} @else if (useSelectBox()) {\n <div\n class=\"w-full flex flex-col gap-4\"\n [class.pointer-events-none]=\"isChoosing()\"\n [class.opacity-60]=\"isChoosing()\"\n (keydown.capture)=\"handleSelectBoxKeyDown($event)\"\n >\n <ax-lookup\n class=\"w-full\"\n mode=\"drop-down-list\"\n [dataSource]=\"allApplications()\"\n textField=\"title\"\n valueField=\"id\"\n [value]=\"selectedApplication()?.id\"\n [itemHeight]=\"56\"\n [searchable]=\"true\"\n [placeholder]=\"('@auth:application-chooser.select-placeholder' | translate | async) ?? ''\"\n [itemTemplate]=\"applicationItemTemplate\"\n [selectedTemplate]=\"applicationItemTemplate\"\n (onOpened)=\"isSelectBoxOpen.set(true)\"\n (onClosed)=\"isSelectBoxOpen.set(false)\"\n (onValueChanged)=\"handleApplicationSelect($event)\"\n (onSelectionChanged)=\"handleApplicationSelectionChanged($event)\"\n >\n </ax-lookup>\n <ax-button\n class=\"w-full\"\n color=\"primary\"\n [disabled]=\"!canApply() || isChoosing()\"\n [text]=\"('@general:actions.apply.title' | translate | async) ?? ''\"\n (onClick)=\"applySelection()\"\n >\n @if (isChoosing()) {\n <ax-loading></ax-loading>\n }\n </ax-button>\n </div>\n} @else {\n <div\n axListNavigation\n #listNav=\"axListNavigation\"\n class=\"w-full overflow-auto max-h-[300px] flex flex-col divide-y divide-neutral-100 dark:divide-neutral-800\"\n role=\"listbox\"\n [class.pointer-events-none]=\"isChoosing()\"\n >\n @for (application of allApplications(); track application.id) {\n <div\n axListNavigationItem\n #navItem=\"axListNavigationItem\"\n tabindex=\"0\"\n role=\"option\"\n [attr.aria-selected]=\"isApplicationSelected(application)\"\n [attr.aria-busy]=\"choosingId() === application.id\"\n class=\"flex gap-2 items-center p-2 cursor-pointer rounded-md transition-colors outline-none hover:bg-primary-lightest hover:dark:bg-primary-dark focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-primary\"\n [class.bg-primary-lighter]=\"isApplicationSelected(application)\"\n [class.dark:bg-primary-darker]=\"isApplicationSelected(application)\"\n [class.text-primary-on-lighter]=\"isApplicationSelected(application)\"\n [class.dark:text-primary-on-darker]=\"isApplicationSelected(application)\"\n [class.opacity-50]=\"isChoosing() && choosingId() !== application.id\"\n [class.cursor-wait]=\"isChoosing()\"\n (click)=\"chooseApplication(application)\"\n (keydown)=\"handleListItemKeyDown($event, application)\"\n >\n <div class=\"flex flex-1 gap-3 items-center min-w-0\">\n <div class=\"shrink-0 size-12 overflow-hidden rounded-lg\">\n <axp-logo\n [logoKey]=\"applicationLogoKey(application)\"\n appearance=\"colored\"\n [size]=\"42\"\n [attr.alt]=\"(application.title | translate | async) ?? ''\"\n class=\"size-12 overflow-hidden rounded-lg\"\n ></axp-logo>\n </div>\n <span class=\"flex-1 min-w-0 text-start md:text-base text-sm break-words md:truncate\">{{\n application.title | translate | async\n }}</span>\n @if (application.edition?.title) {\n <span class=\"text-muted text-xs shrink-0\">{{\n application.edition?.title | translate | async\n }}</span>\n }\n </div>\n @if (choosingId() === application.id) {\n <ax-loading class=\"shrink-0\"></ax-loading>\n }\n </div>\n }\n </div>\n}\n\n<ng-template #applicationItemTemplate let-item>\n <div class=\"flex gap-3 items-center p-2\">\n <div class=\"size-12 overflow-hidden rounded-lg shrink-0\">\n <axp-logo\n [logoKey]=\"applicationLogoKey(item)\"\n appearance=\"colored\"\n [size]=\"42\"\n [attr.alt]=\"(item.title | translate | async) ?? ''\"\n class=\"size-12 overflow-hidden rounded-lg\"\n ></axp-logo>\n </div>\n <span class=\"flex-1 text-start md:text-base text-sm\">{{ item.title | translate | async }}</span>\n @if (item.edition?.title) {\n <span class=\"text-muted text-xs\">{{ item.edition.title | translate | async }}</span>\n }\n </div>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "component", type: i2.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: AXSkeletonModule }, { kind: "component", type: i3.AXSkeletonComponent, selector: "ax-skeleton", inputs: ["animated"] }, { kind: "component", type: AXLookupComponent, selector: "ax-lookup", inputs: ["name", "mode", "dataSource", "treeDataSource", "valueField", "textField", "disabledField", "columns", "treeParentField", "hasChildrenField", "searchable", "adaptivityEnabled", "caption", "alternate", "searchPlaceholder", "placeholder", "disabled", "readonly", "look", "itemHeight", "maxVisibleItems", "treeSelectionBehavior", "highlightSearch", "itemTemplate", "selectedTemplate", "emptyTemplate", "loadingTemplate", "value", "valueItems"], outputs: ["lookChange", "valueChange", "onValueChanged", "onSelectionChanged", "onFocus", "onBlur", "onItemClick", "onItemSelected", "onOpened", "onClosed"] }, { kind: "ngmodule", type: AXListNavigationModule }, { kind: "directive", type: i4.AXListNavigationDirective, selector: "[axListNavigation]", inputs: ["orientation"], outputs: ["onNavigationChanged", "onKeypress"], exportAs: ["axListNavigation"] }, { kind: "directive", type: i4.AXListNavigationItemDirective, selector: "[axListNavigationItem]", outputs: ["onKeypress"], exportAs: ["axListNavigationItem"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "component", type: AXPLogoComponent, selector: "axp-logo", inputs: ["logoKey", "appearance", "size", "format"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i5$1.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1216
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPAppChooserListComponent, isStandalone: true, selector: "axp-app-chooser-list", inputs: { simple: { classPropertyName: "simple", publicName: "simple", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { applicationChosen: "applicationChosen", loadingChange: "loadingChange" }, viewQueries: [{ propertyName: "listNav", first: true, predicate: AXListNavigationDirective, descendants: true, isSignal: true }, { propertyName: "listItems", predicate: AXListNavigationItemDirective, descendants: true, isSignal: true }], ngImport: i0, template: "@if (isLoading()) {\n <div class=\"w-full flex flex-col gap-3\">\n @for (item of skeletonItems; track item) {\n <div class=\"flex gap-3 items-center p-2\">\n <ax-skeleton [animated]=\"true\" class=\"size-10 rounded-lg shrink-0\"></ax-skeleton>\n <ax-skeleton [animated]=\"true\" class=\"flex-1 h-5 rounded-md\"></ax-skeleton>\n <ax-skeleton [animated]=\"true\" class=\"w-16 h-4 rounded-md shrink-0\"></ax-skeleton>\n </div>\n }\n </div>\n} @else if (useSelectBox()) {\n <div\n class=\"w-full flex flex-col gap-4\"\n [class.pointer-events-none]=\"isChoosing()\"\n [class.opacity-60]=\"isChoosing()\"\n (keydown.capture)=\"handleSelectBoxKeyDown($event)\"\n >\n <ax-lookup\n class=\"w-full\"\n mode=\"drop-down-list\"\n [dataSource]=\"allApplications()\"\n textField=\"title\"\n valueField=\"id\"\n [value]=\"selectedApplication()?.id\"\n [itemHeight]=\"56\"\n [searchable]=\"true\"\n [placeholder]=\"('@auth:application-chooser.select-placeholder' | translate | async) ?? ''\"\n [itemTemplate]=\"applicationItemTemplate\"\n [selectedTemplate]=\"applicationItemTemplate\"\n (onOpened)=\"isSelectBoxOpen.set(true)\"\n (onClosed)=\"isSelectBoxOpen.set(false)\"\n (onValueChanged)=\"handleApplicationSelect($event)\"\n (onSelectionChanged)=\"handleApplicationSelectionChanged($event)\"\n >\n </ax-lookup>\n <ax-button\n class=\"w-full\"\n color=\"primary\"\n [disabled]=\"!canApply() || isChoosing()\"\n [text]=\"('@general:actions.apply.title' | translate | async) ?? ''\"\n (onClick)=\"applySelection()\"\n >\n @if (isChoosing()) {\n <ax-loading></ax-loading>\n }\n </ax-button>\n </div>\n} @else {\n <div\n axListNavigation\n #listNav=\"axListNavigation\"\n class=\"w-full overflow-auto max-h-[300px] flex flex-col divide-y divide-neutral-100 dark:divide-neutral-800\"\n role=\"listbox\"\n [class.pointer-events-none]=\"isChoosing()\"\n >\n @for (application of allApplications(); track application.id) {\n <div\n axListNavigationItem\n #navItem=\"axListNavigationItem\"\n tabindex=\"0\"\n role=\"option\"\n [attr.aria-selected]=\"isApplicationSelected(application)\"\n [attr.aria-busy]=\"choosingId() === application.id\"\n class=\"flex gap-2 items-center p-2 cursor-pointer rounded-md transition-colors outline-none hover:bg-primary-lightest hover:dark:bg-primary-dark focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-primary\"\n [class.bg-primary-lighter]=\"isApplicationSelected(application)\"\n [class.dark:bg-primary-darker]=\"isApplicationSelected(application)\"\n [class.text-primary-on-lighter]=\"isApplicationSelected(application)\"\n [class.dark:text-primary-on-darker]=\"isApplicationSelected(application)\"\n [class.opacity-50]=\"isChoosing() && choosingId() !== application.id\"\n [class.cursor-wait]=\"isChoosing()\"\n (click)=\"chooseApplication(application)\"\n (keydown)=\"handleListItemKeyDown($event, application)\"\n >\n <div class=\"flex flex-1 gap-3 items-center min-w-0\">\n <div class=\"shrink-0 size-12 overflow-hidden rounded-lg\">\n <axp-logo\n [logoKey]=\"applicationLogoKey(application)\"\n appearance=\"colored\"\n [size]=\"42\"\n [attr.alt]=\"(application.title | translate | async) ?? ''\"\n class=\"size-12 overflow-hidden rounded-lg\"\n ></axp-logo>\n </div>\n <span class=\"flex-1 min-w-0 text-start md:text-base text-sm break-words md:truncate\">{{\n application.title | translate | async\n }}</span>\n @if (application.edition?.title) {\n <span class=\"text-muted text-xs shrink-0\">{{\n application.edition?.title | translate | async\n }}</span>\n }\n </div>\n @if (choosingId() === application.id) {\n <ax-loading class=\"shrink-0\"></ax-loading>\n }\n </div>\n }\n </div>\n}\n\n<ng-template #applicationItemTemplate let-item>\n <div class=\"flex gap-3 items-center p-2\">\n <div class=\"size-12 overflow-hidden rounded-lg shrink-0\">\n <axp-logo\n [logoKey]=\"applicationLogoKey(item)\"\n appearance=\"colored\"\n [size]=\"42\"\n [attr.alt]=\"(item.title | translate | async) ?? ''\"\n class=\"size-12 overflow-hidden rounded-lg\"\n ></axp-logo>\n </div>\n <span class=\"flex-1 text-start md:text-base text-sm\">{{ item.title | translate | async }}</span>\n @if (item.edition?.title) {\n <span class=\"text-muted text-xs\">{{ item.edition.title | translate | async }}</span>\n }\n </div>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "component", type: i2.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: AXSkeletonModule }, { kind: "component", type: i3.AXSkeletonComponent, selector: "ax-skeleton", inputs: ["animated"] }, { kind: "component", type: AXLookupComponent, selector: "ax-lookup", inputs: ["name", "mode", "dataSource", "treeDataSource", "valueField", "textField", "disabledField", "columns", "treeParentField", "hasChildrenField", "searchable", "adaptivityEnabled", "caption", "alternate", "searchPlaceholder", "placeholder", "disabled", "readonly", "look", "itemHeight", "maxVisibleItems", "treeSelectionBehavior", "highlightSearch", "itemTemplate", "selectedTemplate", "emptyTemplate", "loadingTemplate", "value", "valueItems"], outputs: ["lookChange", "valueChange", "onValueChanged", "onSelectionChanged", "onFocus", "onBlur", "onItemClick", "onItemSelected", "onOpened", "onClosed"] }, { kind: "ngmodule", type: AXListNavigationModule }, { kind: "directive", type: i4.AXListNavigationDirective, selector: "[axListNavigation]", inputs: ["orientation"], outputs: ["onNavigationChanged", "onKeypress"], exportAs: ["axListNavigation"] }, { kind: "directive", type: i4.AXListNavigationItemDirective, selector: "[axListNavigationItem]", outputs: ["onKeypress"], exportAs: ["axListNavigationItem"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "component", type: AXPLogoComponent, selector: "axp-logo", inputs: ["logoKey", "appearance", "size", "format"] }, { kind: "pipe", type: i3$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1206
1217
  }
1207
1218
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPAppChooserListComponent, decorators: [{
1208
1219
  type: Component,
@@ -1231,7 +1242,7 @@ class AXMAppChooserSlotComponent {
1231
1242
  this.appPopover()?.close();
1232
1243
  }
1233
1244
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMAppChooserSlotComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1234
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXMAppChooserSlotComponent, isStandalone: true, selector: "ng-component", viewQueries: [{ propertyName: "appPopover", first: true, predicate: ["appPopover"], descendants: true, isSignal: true }], ngImport: i0, template: "@if (applications$ | async; as applications) {\n @if (applications.length > 1) {\n <ax-button [color]=\"themeStore.headerButtonColor()\" [look]=\"themeStore.headerButtonLook()\" #appChooser>\n <ax-icon class=\"fa-regular fa-grid-2\"> </ax-icon>\n </ax-button>\n <ax-popover [target]=\"appChooser\" [openOn]=\"'toggle'\" [closeOn]=\"'clickOut'\" #appPopover>\n <div class=\"bg-lightest border overflow-hidden rounded-md shadow-md w-full min-w-64 p-1\">\n <axp-app-chooser-list [simple]=\"true\" (applicationChosen)=\"closePopover()\"></axp-app-chooser-list>\n </div>\n </ax-popover>\n }\n}\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXPopoverModule }, { kind: "component", type: i2$1.AXPopoverComponent, selector: "ax-popover", inputs: ["width", "disablePanelClass", "visualContextScope", "disabled", "offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "closeOnScroll", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i3$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: AXPAppChooserListComponent, selector: "axp-app-chooser-list", inputs: ["simple"], outputs: ["applicationChosen", "loadingChange"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
1245
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXMAppChooserSlotComponent, isStandalone: true, selector: "ng-component", viewQueries: [{ propertyName: "appPopover", first: true, predicate: ["appPopover"], descendants: true, isSignal: true }], ngImport: i0, template: "@if (applications$ | async; as applications) {\n @if (applications.length > 1) {\n <ax-button [color]=\"themeStore.headerButtonColor()\" [look]=\"themeStore.headerButtonLook()\" #appChooser>\n <ax-icon class=\"fa-regular fa-grid-2\"> </ax-icon>\n </ax-button>\n <ax-popover [target]=\"appChooser\" [openOn]=\"'toggle'\" [closeOn]=\"'clickOut'\" #appPopover>\n <div class=\"bg-lightest border overflow-hidden rounded-md shadow-md w-full min-w-64 p-1\">\n <axp-app-chooser-list [simple]=\"true\" (applicationChosen)=\"closePopover()\"></axp-app-chooser-list>\n </div>\n </ax-popover>\n }\n}\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXPopoverModule }, { kind: "component", type: i2$1.AXPopoverComponent, selector: "ax-popover", inputs: ["width", "disablePanelClass", "visualContextScope", "disabled", "offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "closeOnScroll", "closeOnNavigation", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2$2.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: AXPAppChooserListComponent, selector: "axp-app-chooser-list", inputs: ["simple"], outputs: ["applicationChosen", "loadingChange"] }, { kind: "pipe", type: i3$1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
1235
1246
  }
1236
1247
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMAppChooserSlotComponent, decorators: [{
1237
1248
  type: Component,
@@ -1437,7 +1448,7 @@ class AXPTenantChooserListComponent {
1437
1448
  }
1438
1449
  }
1439
1450
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPTenantChooserListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1440
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPTenantChooserListComponent, isStandalone: true, selector: "axp-tenant-chooser-list", inputs: { simple: { classPropertyName: "simple", publicName: "simple", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { tenantChosen: "tenantChosen", loadingChange: "loadingChange" }, viewQueries: [{ propertyName: "listNav", first: true, predicate: AXListNavigationDirective, descendants: true, isSignal: true }, { propertyName: "listItems", predicate: AXListNavigationItemDirective, descendants: true, isSignal: true }], ngImport: i0, template: "@if (isLoading()) {\n <!--->\n <!-- ----- Compact dropdown skeleton ----- -->\n @if (simple()) {\n <div class=\"w-full flex flex-col gap-1\">\n @for (item of skeletonItems; track item) {\n <div class=\"flex gap-2 items-center p-2\">\n <ax-skeleton [animated]=\"true\" class=\"size-6 rounded-md shrink-0\"></ax-skeleton>\n <ax-skeleton [animated]=\"true\" class=\"flex-1 h-4 rounded-md\"></ax-skeleton>\n </div>\n }\n </div>\n }\n <!-- ----- Full chooser skeleton ----- -->\n @else {\n <div class=\"w-full flex flex-col gap-3\">\n @for (item of skeletonItems; track item) {\n <div class=\"flex gap-3 items-center p-2\">\n <ax-skeleton [animated]=\"true\" class=\"size-12 rounded-lg shrink-0\"></ax-skeleton>\n <ax-skeleton [animated]=\"true\" class=\"flex-1 h-5 rounded-md\"></ax-skeleton>\n </div>\n }\n </div>\n }\n}\n<!-- ----- Compact list for header/sidebar dropdowns ----- -->\n@else if (simple()) {\n <div\n class=\"w-full overflow-auto max-h-[300px] flex flex-col gap-1\"\n [class.pointer-events-none]=\"isChoosing()\"\n >\n @for (tenant of allTenants(); track tenant.id) {\n <div\n class=\"flex gap-2 items-center p-2 cursor-pointer rounded-md transition-colors hover:bg-primary-lightest hover:dark:bg-primary-dark\"\n [class.bg-primary-lighter]=\"isTenantSelected(tenant)\"\n [class.dark:bg-primary-darker]=\"isTenantSelected(tenant)\"\n [class.opacity-50]=\"isChoosing() && choosingId() !== tenant.id\"\n [class.cursor-wait]=\"isChoosing()\"\n [attr.aria-busy]=\"choosingId() === tenant.id\"\n (click)=\"chooseTenant(tenant)\"\n >\n <div class=\"flex flex-1 gap-2 items-center min-w-0\">\n <div class=\"shrink-0 size-6 overflow-hidden rounded-md grid place-items-center\">\n <axp-logo\n [logoKey]=\"tenantLogoKey(tenant)\"\n appearance=\"colored\"\n [size]=\"24\"\n [attr.alt]=\"(tenant.title | translate | async) ?? ''\"\n class=\"size-6 overflow-hidden\"\n ></axp-logo>\n </div>\n <span class=\"flex-1 truncate text-start text-sm\">{{\n tenant.title | translate | async\n }}</span>\n </div>\n <!--->\n <!-- ----- Choosing indicator for this tenant ----- -->\n @if (choosingId() === tenant.id) {\n <ax-loading class=\"shrink-0\"></ax-loading>\n }\n </div>\n }\n </div>\n}\n<!-- ----- Lookup when the catalog is long ----- -->\n@else if (useSelectBox()) {\n <div\n class=\"w-full flex flex-col gap-4\"\n [class.pointer-events-none]=\"isChoosing()\"\n [class.opacity-60]=\"isChoosing()\"\n (keydown.capture)=\"handleSelectBoxKeyDown($event)\"\n >\n <ax-lookup\n class=\"w-full\"\n mode=\"drop-down-list\"\n [dataSource]=\"allTenants()\"\n textField=\"title\"\n valueField=\"id\"\n [value]=\"selectedTenant()?.id\"\n [itemHeight]=\"56\"\n [searchable]=\"true\"\n [placeholder]=\"('@auth:tenant-chooser.select-placeholder' | translate | async) ?? ''\"\n [itemTemplate]=\"tenantItemTemplate\"\n [selectedTemplate]=\"tenantItemTemplate\"\n (onOpened)=\"isSelectBoxOpen.set(true)\"\n (onClosed)=\"isSelectBoxOpen.set(false)\"\n (onValueChanged)=\"handleTenantSelect($event)\"\n (onSelectionChanged)=\"handleTenantSelectionChanged($event)\"\n >\n </ax-lookup>\n <ax-button\n class=\"w-full\"\n color=\"primary\"\n [disabled]=\"!canApply() || isChoosing()\"\n [text]=\"('@general:actions.apply.title' | translate | async) ?? ''\"\n (onClick)=\"applySelection()\"\n >\n @if (isChoosing()) {\n <ax-loading></ax-loading>\n }\n </ax-button>\n </div>\n}\n<!-- ----- Full list on the login tenant chooser ----- -->\n@else {\n @if (showSearchAndViewAll()) {\n <ax-search-box\n [placeholder]=\"'@general:search.title' | translate | async\"\n [ngModel]=\"searchValue()\"\n (ngModelChange)=\"handleSearch($event)\"\n class=\"w-full\"\n >\n <ax-clear-button></ax-clear-button>\n </ax-search-box>\n }\n <div\n axListNavigation\n #listNav=\"axListNavigation\"\n class=\"w-full overflow-auto max-h-[300px] flex flex-col divide-y divide-neutral-100 dark:divide-neutral-800\"\n role=\"listbox\"\n [class.pointer-events-none]=\"isChoosing()\"\n >\n @for (tenant of displayedTenants(); track tenant.id) {\n <div\n axListNavigationItem\n #navItem=\"axListNavigationItem\"\n tabindex=\"0\"\n role=\"option\"\n [attr.aria-selected]=\"isTenantSelected(tenant)\"\n [attr.aria-busy]=\"choosingId() === tenant.id\"\n class=\"flex gap-2 items-center p-2 cursor-pointer rounded-md transition-colors outline-none hover:bg-primary-lightest hover:dark:bg-primary-dark focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-primary\"\n [class.bg-primary-lighter]=\"isTenantSelected(tenant)\"\n [class.dark:bg-primary-darker]=\"isTenantSelected(tenant)\"\n [class.text-primary-on-lighter]=\"isTenantSelected(tenant)\"\n [class.dark:text-primary-on-darker]=\"isTenantSelected(tenant)\"\n [class.opacity-50]=\"isChoosing() && choosingId() !== tenant.id\"\n [class.cursor-wait]=\"isChoosing()\"\n (click)=\"chooseTenant(tenant)\"\n (keydown)=\"handleListItemKeyDown($event, tenant)\"\n >\n <div class=\"flex flex-1 gap-3 items-center min-w-0\">\n <div class=\"shrink-0 size-12 overflow-hidden rounded-lg\">\n <axp-logo\n [logoKey]=\"tenantLogoKey(tenant)\"\n appearance=\"colored\"\n [size]=\"42\"\n [attr.alt]=\"(tenant.title | translate | async) ?? ''\"\n class=\"size-12 overflow-hidden rounded-lg\"\n ></axp-logo>\n </div>\n <span class=\"flex-1 truncate text-start md:text-base text-sm\">{{\n tenant.title | translate | async\n }}</span>\n </div>\n @if (choosingId() === tenant.id) {\n <ax-loading class=\"shrink-0\"></ax-loading>\n }\n </div>\n }\n </div>\n @if (showSearchAndViewAll()) {\n <div class=\"mt-6 w-full flex justify-center\">\n <ax-button\n (onClick)=\"showAllTenants()\"\n class=\"w-full\"\n look=\"outline\"\n [disabled]=\"isChoosing()\"\n [text]=\"\n showAll()\n ? ('@general:actions.view-less.title' | translate | async)\n : ('@general:actions.view-all.title' | translate | async)\n \"\n ></ax-button>\n </div>\n }\n}\n\n<ng-template #tenantItemTemplate let-item>\n <div class=\"flex gap-3 items-center p-2\">\n <div class=\"size-12 overflow-hidden rounded-lg shrink-0\">\n <axp-logo\n [logoKey]=\"tenantLogoKey(item)\"\n appearance=\"colored\"\n [size]=\"42\"\n [attr.alt]=\"(item.title | translate | async) ?? ''\"\n class=\"size-12 overflow-hidden rounded-lg\"\n ></axp-logo>\n </div>\n <span class=\"text-start md:text-base text-sm\">{{ item.title | translate | async }}</span>\n </div>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i3$1.AXDecoratorClearButtonComponent, selector: "ax-clear-button", inputs: ["icon"] }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "component", type: i2.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: AXSkeletonModule }, { kind: "component", type: i3.AXSkeletonComponent, selector: "ax-skeleton", inputs: ["animated"] }, { kind: "component", type: AXLookupComponent, selector: "ax-lookup", inputs: ["name", "mode", "dataSource", "treeDataSource", "valueField", "textField", "disabledField", "columns", "treeParentField", "hasChildrenField", "searchable", "adaptivityEnabled", "caption", "alternate", "searchPlaceholder", "placeholder", "disabled", "readonly", "look", "itemHeight", "maxVisibleItems", "treeSelectionBehavior", "highlightSearch", "itemTemplate", "selectedTemplate", "emptyTemplate", "loadingTemplate", "value", "valueItems"], outputs: ["lookChange", "valueChange", "onValueChanged", "onSelectionChanged", "onFocus", "onBlur", "onItemClick", "onItemSelected", "onOpened", "onClosed"] }, { kind: "ngmodule", type: AXSearchBoxModule }, { kind: "component", type: i6.AXSearchBoxComponent, selector: "ax-search-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "class", "delayTime", "type", "autoSearch"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }, { kind: "ngmodule", type: AXListNavigationModule }, { kind: "directive", type: i4.AXListNavigationDirective, selector: "[axListNavigation]", inputs: ["orientation"], outputs: ["onNavigationChanged", "onKeypress"], exportAs: ["axListNavigation"] }, { kind: "directive", type: i4.AXListNavigationItemDirective, selector: "[axListNavigationItem]", outputs: ["onKeypress"], exportAs: ["axListNavigationItem"] }, { kind: "component", type: AXPLogoComponent, selector: "axp-logo", inputs: ["logoKey", "appearance", "size", "format"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i5$1.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1451
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPTenantChooserListComponent, isStandalone: true, selector: "axp-tenant-chooser-list", inputs: { simple: { classPropertyName: "simple", publicName: "simple", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { tenantChosen: "tenantChosen", loadingChange: "loadingChange" }, viewQueries: [{ propertyName: "listNav", first: true, predicate: AXListNavigationDirective, descendants: true, isSignal: true }, { propertyName: "listItems", predicate: AXListNavigationItemDirective, descendants: true, isSignal: true }], ngImport: i0, template: "@if (isLoading()) {\n <!--->\n <!-- ----- Compact dropdown skeleton ----- -->\n @if (simple()) {\n <div class=\"w-full flex flex-col gap-1\">\n @for (item of skeletonItems; track item) {\n <div class=\"flex gap-2 items-center p-2\">\n <ax-skeleton [animated]=\"true\" class=\"size-6 rounded-md shrink-0\"></ax-skeleton>\n <ax-skeleton [animated]=\"true\" class=\"flex-1 h-4 rounded-md\"></ax-skeleton>\n </div>\n }\n </div>\n }\n <!-- ----- Full chooser skeleton ----- -->\n @else {\n <div class=\"w-full flex flex-col gap-3\">\n @for (item of skeletonItems; track item) {\n <div class=\"flex gap-3 items-center p-2\">\n <ax-skeleton [animated]=\"true\" class=\"size-12 rounded-lg shrink-0\"></ax-skeleton>\n <ax-skeleton [animated]=\"true\" class=\"flex-1 h-5 rounded-md\"></ax-skeleton>\n </div>\n }\n </div>\n }\n}\n<!-- ----- Compact list for header/sidebar dropdowns ----- -->\n@else if (simple()) {\n <div\n class=\"w-full overflow-auto max-h-[300px] flex flex-col gap-1\"\n [class.pointer-events-none]=\"isChoosing()\"\n >\n @for (tenant of allTenants(); track tenant.id) {\n <div\n class=\"flex gap-2 items-center p-2 cursor-pointer rounded-md transition-colors hover:bg-primary-lightest hover:dark:bg-primary-dark\"\n [class.bg-primary-lighter]=\"isTenantSelected(tenant)\"\n [class.dark:bg-primary-darker]=\"isTenantSelected(tenant)\"\n [class.opacity-50]=\"isChoosing() && choosingId() !== tenant.id\"\n [class.cursor-wait]=\"isChoosing()\"\n [attr.aria-busy]=\"choosingId() === tenant.id\"\n (click)=\"chooseTenant(tenant)\"\n >\n <div class=\"flex flex-1 gap-2 items-center min-w-0\">\n <div class=\"shrink-0 size-6 overflow-hidden rounded-md grid place-items-center\">\n <axp-logo\n [logoKey]=\"tenantLogoKey(tenant)\"\n appearance=\"colored\"\n [size]=\"24\"\n [attr.alt]=\"(tenant.title | translate | async) ?? ''\"\n class=\"size-6 overflow-hidden\"\n ></axp-logo>\n </div>\n <span class=\"flex-1 truncate text-start text-sm\">{{\n tenant.title | translate | async\n }}</span>\n </div>\n <!--->\n <!-- ----- Choosing indicator for this tenant ----- -->\n @if (choosingId() === tenant.id) {\n <ax-loading class=\"shrink-0\"></ax-loading>\n }\n </div>\n }\n </div>\n}\n<!-- ----- Lookup when the catalog is long ----- -->\n@else if (useSelectBox()) {\n <div\n class=\"w-full flex flex-col gap-4\"\n [class.pointer-events-none]=\"isChoosing()\"\n [class.opacity-60]=\"isChoosing()\"\n (keydown.capture)=\"handleSelectBoxKeyDown($event)\"\n >\n <ax-lookup\n class=\"w-full\"\n mode=\"drop-down-list\"\n [dataSource]=\"allTenants()\"\n textField=\"title\"\n valueField=\"id\"\n [value]=\"selectedTenant()?.id\"\n [itemHeight]=\"56\"\n [searchable]=\"true\"\n [placeholder]=\"('@auth:tenant-chooser.select-placeholder' | translate | async) ?? ''\"\n [itemTemplate]=\"tenantItemTemplate\"\n [selectedTemplate]=\"tenantItemTemplate\"\n (onOpened)=\"isSelectBoxOpen.set(true)\"\n (onClosed)=\"isSelectBoxOpen.set(false)\"\n (onValueChanged)=\"handleTenantSelect($event)\"\n (onSelectionChanged)=\"handleTenantSelectionChanged($event)\"\n >\n </ax-lookup>\n <ax-button\n class=\"w-full\"\n color=\"primary\"\n [disabled]=\"!canApply() || isChoosing()\"\n [text]=\"('@general:actions.apply.title' | translate | async) ?? ''\"\n (onClick)=\"applySelection()\"\n >\n @if (isChoosing()) {\n <ax-loading></ax-loading>\n }\n </ax-button>\n </div>\n}\n<!-- ----- Full list on the login tenant chooser ----- -->\n@else {\n @if (showSearchAndViewAll()) {\n <ax-search-box\n [placeholder]=\"'@general:search.title' | translate | async\"\n [ngModel]=\"searchValue()\"\n (ngModelChange)=\"handleSearch($event)\"\n class=\"w-full\"\n >\n <ax-clear-button></ax-clear-button>\n </ax-search-box>\n }\n <div\n axListNavigation\n #listNav=\"axListNavigation\"\n class=\"w-full overflow-auto max-h-[300px] flex flex-col divide-y divide-neutral-100 dark:divide-neutral-800\"\n role=\"listbox\"\n [class.pointer-events-none]=\"isChoosing()\"\n >\n @for (tenant of displayedTenants(); track tenant.id) {\n <div\n axListNavigationItem\n #navItem=\"axListNavigationItem\"\n tabindex=\"0\"\n role=\"option\"\n [attr.aria-selected]=\"isTenantSelected(tenant)\"\n [attr.aria-busy]=\"choosingId() === tenant.id\"\n class=\"flex gap-2 items-center p-2 cursor-pointer rounded-md transition-colors outline-none hover:bg-primary-lightest hover:dark:bg-primary-dark focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-primary\"\n [class.bg-primary-lighter]=\"isTenantSelected(tenant)\"\n [class.dark:bg-primary-darker]=\"isTenantSelected(tenant)\"\n [class.text-primary-on-lighter]=\"isTenantSelected(tenant)\"\n [class.dark:text-primary-on-darker]=\"isTenantSelected(tenant)\"\n [class.opacity-50]=\"isChoosing() && choosingId() !== tenant.id\"\n [class.cursor-wait]=\"isChoosing()\"\n (click)=\"chooseTenant(tenant)\"\n (keydown)=\"handleListItemKeyDown($event, tenant)\"\n >\n <div class=\"flex flex-1 gap-3 items-center min-w-0\">\n <div class=\"shrink-0 size-12 overflow-hidden rounded-lg\">\n <axp-logo\n [logoKey]=\"tenantLogoKey(tenant)\"\n appearance=\"colored\"\n [size]=\"42\"\n [attr.alt]=\"(tenant.title | translate | async) ?? ''\"\n class=\"size-12 overflow-hidden rounded-lg\"\n ></axp-logo>\n </div>\n <span class=\"flex-1 truncate text-start md:text-base text-sm\">{{\n tenant.title | translate | async\n }}</span>\n </div>\n @if (choosingId() === tenant.id) {\n <ax-loading class=\"shrink-0\"></ax-loading>\n }\n </div>\n }\n </div>\n @if (showSearchAndViewAll()) {\n <div class=\"mt-6 w-full flex justify-center\">\n <ax-button\n (onClick)=\"showAllTenants()\"\n class=\"w-full\"\n look=\"outline\"\n [disabled]=\"isChoosing()\"\n [text]=\"\n showAll()\n ? ('@general:actions.view-less.title' | translate | async)\n : ('@general:actions.view-all.title' | translate | async)\n \"\n ></ax-button>\n </div>\n }\n}\n\n<ng-template #tenantItemTemplate let-item>\n <div class=\"flex gap-3 items-center p-2\">\n <div class=\"size-12 overflow-hidden rounded-lg shrink-0\">\n <axp-logo\n [logoKey]=\"tenantLogoKey(item)\"\n appearance=\"colored\"\n [size]=\"42\"\n [attr.alt]=\"(item.title | translate | async) ?? ''\"\n class=\"size-12 overflow-hidden rounded-lg\"\n ></axp-logo>\n </div>\n <span class=\"text-start md:text-base text-sm\">{{ item.title | translate | async }}</span>\n </div>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2$2.AXDecoratorClearButtonComponent, selector: "ax-clear-button", inputs: ["icon"] }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "component", type: i2.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: AXSkeletonModule }, { kind: "component", type: i3.AXSkeletonComponent, selector: "ax-skeleton", inputs: ["animated"] }, { kind: "component", type: AXLookupComponent, selector: "ax-lookup", inputs: ["name", "mode", "dataSource", "treeDataSource", "valueField", "textField", "disabledField", "columns", "treeParentField", "hasChildrenField", "searchable", "adaptivityEnabled", "caption", "alternate", "searchPlaceholder", "placeholder", "disabled", "readonly", "look", "itemHeight", "maxVisibleItems", "treeSelectionBehavior", "highlightSearch", "itemTemplate", "selectedTemplate", "emptyTemplate", "loadingTemplate", "value", "valueItems"], outputs: ["lookChange", "valueChange", "onValueChanged", "onSelectionChanged", "onFocus", "onBlur", "onItemClick", "onItemSelected", "onOpened", "onClosed"] }, { kind: "ngmodule", type: AXSearchBoxModule }, { kind: "component", type: i6.AXSearchBoxComponent, selector: "ax-search-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "class", "delayTime", "type", "autoSearch"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }, { kind: "ngmodule", type: AXListNavigationModule }, { kind: "directive", type: i4.AXListNavigationDirective, selector: "[axListNavigation]", inputs: ["orientation"], outputs: ["onNavigationChanged", "onKeypress"], exportAs: ["axListNavigation"] }, { kind: "directive", type: i4.AXListNavigationItemDirective, selector: "[axListNavigationItem]", outputs: ["onKeypress"], exportAs: ["axListNavigationItem"] }, { kind: "component", type: AXPLogoComponent, selector: "axp-logo", inputs: ["logoKey", "appearance", "size", "format"] }, { kind: "pipe", type: i3$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1441
1452
  }
1442
1453
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPTenantChooserListComponent, decorators: [{
1443
1454
  type: Component,
@@ -1472,7 +1483,7 @@ class AXPTenantChooserDropdownComponent {
1472
1483
  //#endregion
1473
1484
  //#region ----- Constants -----
1474
1485
  /** Shared panel size so sidebar and header tenant popovers match. */
1475
- this.popupPanelClass = 'bg-lightest border overflow-hidden rounded-md shadow-md w-80 p-1';
1486
+ this.popupPanelClass = 'bg-lightest overflow-hidden rounded-md shadow-md w-full p-1';
1476
1487
  //#endregion
1477
1488
  //#region ----- Inputs -----
1478
1489
  /**
@@ -1498,19 +1509,11 @@ class AXPTenantChooserDropdownComponent {
1498
1509
  void this.router.navigate(['/auth/account/tenant-chooser']);
1499
1510
  }
1500
1511
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPTenantChooserDropdownComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1501
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPTenantChooserDropdownComponent, isStandalone: true, selector: "axp-tenant-chooser-dropdown", inputs: { inline: "inline" }, viewQueries: [{ propertyName: "tenantPopover", first: true, predicate: ["tenantPopover"], descendants: true, isSignal: true }], ngImport: i0, template: "@if (tenantsLoading()) {\n <ax-skeleton [animated]=\"true\" class=\"h-5 w-32 max-w-full\"></ax-skeleton>\n} @else if (tenants$ | async; as tenants) {\n @if (inline) {\n @if (tenants.length > 1) {\n <!-- ----- Inline dropdown for multi-tenant ----- -->\n <span\n class=\"text-xs font-medium px-3 cursor-pointer inline-flex items-center gap-1\"\n #inlineTenantTrigger\n >\n {{ ((tenant$ | async)?.title | translate | async) ?? '' }}\n <i class=\"fa-solid fa-caret-down text-2xs opacity-60\"></i>\n </span>\n <ax-popover\n [target]=\"inlineTenantTrigger\"\n [openOn]=\"'toggle'\"\n [closeOn]=\"'clickOut'\"\n [adaptivityEnabled]=\"true\"\n #tenantPopover\n >\n <div [class]=\"popupPanelClass\">\n <axp-tenant-chooser-list\n [simple]=\"true\"\n (tenantChosen)=\"closePopover()\"\n ></axp-tenant-chooser-list>\n </div>\n </ax-popover>\n } @else {\n <!-- ----- Plain text for single tenant ----- -->\n <span class=\"text-xs font-medium px-3\">\n {{ ((tenant$ | async)?.title | translate | async) ?? '' }}\n </span>\n }\n } @else {\n @if (tenants.length > 1) {\n <ax-button\n [text]=\"((tenant$ | async)?.title | translate | async) ?? ''\"\n look=\"blank\"\n #tenantChooser\n >\n <ax-suffix>\n <ax-icon class=\"fa-solid fa-caret-down\"></ax-icon>\n </ax-suffix>\n </ax-button>\n <ax-popover\n [target]=\"tenantChooser\"\n [openOn]=\"'toggle'\"\n [closeOn]=\"'clickOut'\"\n [adaptivityEnabled]=\"true\"\n #tenantPopover\n >\n <div [class]=\"popupPanelClass\">\n <axp-tenant-chooser-list\n [simple]=\"true\"\n (tenantChosen)=\"closePopover()\"\n ></axp-tenant-chooser-list>\n </div>\n </ax-popover>\n } @else {\n <ax-button\n [text]=\"((tenant$ | async)?.title | translate | async) ?? ''\"\n class=\"ax-sm\"\n look=\"blank\"\n ></ax-button>\n }\n }\n}\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXPopoverModule }, { kind: "component", type: i2$1.AXPopoverComponent, selector: "ax-popover", inputs: ["width", "disablePanelClass", "visualContextScope", "disabled", "offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "closeOnScroll", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i3$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i3$1.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXSkeletonModule }, { kind: "component", type: i3.AXSkeletonComponent, selector: "ax-skeleton", inputs: ["animated"] }, { kind: "component", type: AXPTenantChooserListComponent, selector: "axp-tenant-chooser-list", inputs: ["simple"], outputs: ["tenantChosen", "loadingChange"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i5$1.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
1512
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPTenantChooserDropdownComponent, isStandalone: true, selector: "axp-tenant-chooser-dropdown", inputs: { inline: "inline" }, viewQueries: [{ propertyName: "tenantPopover", first: true, predicate: ["tenantPopover"], descendants: true, isSignal: true }], ngImport: i0, template: "@if (tenantsLoading()) {\n <ax-skeleton [animated]=\"true\" class=\"h-5 w-32 max-w-full\"></ax-skeleton>\n} @else if (tenants$ | async; as tenants) {\n @if (inline) {\n @if (tenants.length > 1) {\n <!-- ----- Inline dropdown for multi-tenant ----- -->\n <span\n class=\"text-xs font-medium px-3 cursor-pointer inline-flex items-center gap-1\"\n #inlineTenantTrigger\n >\n {{ ((tenant$ | async)?.title | translate | async) ?? '' }}\n <i class=\"fa-solid fa-caret-down text-2xs opacity-60\"></i>\n </span>\n <ax-popover\n [target]=\"inlineTenantTrigger\"\n [openOn]=\"'toggle'\"\n [closeOn]=\"'clickOut'\"\n [adaptivityEnabled]=\"true\"\n #tenantPopover\n >\n <div [class]=\"popupPanelClass\">\n <axp-tenant-chooser-list\n [simple]=\"true\"\n (tenantChosen)=\"closePopover()\"\n ></axp-tenant-chooser-list>\n </div>\n </ax-popover>\n } @else {\n <!-- ----- Plain text for single tenant ----- -->\n <span class=\"text-xs font-medium px-3\">\n {{ ((tenant$ | async)?.title | translate | async) ?? '' }}\n </span>\n }\n } @else {\n @if (tenants.length > 1) {\n <ax-button\n [text]=\"((tenant$ | async)?.title | translate | async) ?? ''\"\n look=\"blank\"\n #tenantChooser\n >\n <ax-suffix>\n <ax-icon class=\"fa-solid fa-caret-down\"></ax-icon>\n </ax-suffix>\n </ax-button>\n <ax-popover\n [target]=\"tenantChooser\"\n [openOn]=\"'toggle'\"\n [closeOn]=\"'clickOut'\"\n [adaptivityEnabled]=\"true\"\n #tenantPopover\n >\n <div [class]=\"popupPanelClass\">\n <axp-tenant-chooser-list\n [simple]=\"true\"\n (tenantChosen)=\"closePopover()\"\n ></axp-tenant-chooser-list>\n </div>\n </ax-popover>\n } @else {\n <ax-button\n [text]=\"((tenant$ | async)?.title | translate | async) ?? ''\"\n class=\"ax-sm\"\n look=\"blank\"\n ></ax-button>\n }\n }\n}\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXPopoverModule }, { kind: "component", type: i2$1.AXPopoverComponent, selector: "ax-popover", inputs: ["width", "disablePanelClass", "visualContextScope", "disabled", "offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "closeOnScroll", "closeOnNavigation", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2$2.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i2$2.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXSkeletonModule }, { kind: "component", type: i3.AXSkeletonComponent, selector: "ax-skeleton", inputs: ["animated"] }, { kind: "component", type: AXPTenantChooserListComponent, selector: "axp-tenant-chooser-list", inputs: ["simple"], outputs: ["tenantChosen", "loadingChange"] }, { kind: "pipe", type: i3$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
1502
1513
  }
1503
1514
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPTenantChooserDropdownComponent, decorators: [{
1504
1515
  type: Component,
1505
- args: [{ selector: 'axp-tenant-chooser-dropdown', changeDetection: ChangeDetectionStrategy.Eager, imports: [
1506
- CommonModule,
1507
- AXTranslationModule,
1508
- AXButtonModule,
1509
- AXPopoverModule,
1510
- AXDecoratorModule,
1511
- AXSkeletonModule,
1512
- AXPTenantChooserListComponent,
1513
- ], template: "@if (tenantsLoading()) {\n <ax-skeleton [animated]=\"true\" class=\"h-5 w-32 max-w-full\"></ax-skeleton>\n} @else if (tenants$ | async; as tenants) {\n @if (inline) {\n @if (tenants.length > 1) {\n <!-- ----- Inline dropdown for multi-tenant ----- -->\n <span\n class=\"text-xs font-medium px-3 cursor-pointer inline-flex items-center gap-1\"\n #inlineTenantTrigger\n >\n {{ ((tenant$ | async)?.title | translate | async) ?? '' }}\n <i class=\"fa-solid fa-caret-down text-2xs opacity-60\"></i>\n </span>\n <ax-popover\n [target]=\"inlineTenantTrigger\"\n [openOn]=\"'toggle'\"\n [closeOn]=\"'clickOut'\"\n [adaptivityEnabled]=\"true\"\n #tenantPopover\n >\n <div [class]=\"popupPanelClass\">\n <axp-tenant-chooser-list\n [simple]=\"true\"\n (tenantChosen)=\"closePopover()\"\n ></axp-tenant-chooser-list>\n </div>\n </ax-popover>\n } @else {\n <!-- ----- Plain text for single tenant ----- -->\n <span class=\"text-xs font-medium px-3\">\n {{ ((tenant$ | async)?.title | translate | async) ?? '' }}\n </span>\n }\n } @else {\n @if (tenants.length > 1) {\n <ax-button\n [text]=\"((tenant$ | async)?.title | translate | async) ?? ''\"\n look=\"blank\"\n #tenantChooser\n >\n <ax-suffix>\n <ax-icon class=\"fa-solid fa-caret-down\"></ax-icon>\n </ax-suffix>\n </ax-button>\n <ax-popover\n [target]=\"tenantChooser\"\n [openOn]=\"'toggle'\"\n [closeOn]=\"'clickOut'\"\n [adaptivityEnabled]=\"true\"\n #tenantPopover\n >\n <div [class]=\"popupPanelClass\">\n <axp-tenant-chooser-list\n [simple]=\"true\"\n (tenantChosen)=\"closePopover()\"\n ></axp-tenant-chooser-list>\n </div>\n </ax-popover>\n } @else {\n <ax-button\n [text]=\"((tenant$ | async)?.title | translate | async) ?? ''\"\n class=\"ax-sm\"\n look=\"blank\"\n ></ax-button>\n }\n }\n}\n" }]
1516
+ args: [{ selector: 'axp-tenant-chooser-dropdown', changeDetection: ChangeDetectionStrategy.Eager, imports: [CommonModule, AXTranslationModule, AXButtonModule, AXPopoverModule, AXDecoratorModule, AXSkeletonModule, AXPTenantChooserListComponent], template: "@if (tenantsLoading()) {\n <ax-skeleton [animated]=\"true\" class=\"h-5 w-32 max-w-full\"></ax-skeleton>\n} @else if (tenants$ | async; as tenants) {\n @if (inline) {\n @if (tenants.length > 1) {\n <!-- ----- Inline dropdown for multi-tenant ----- -->\n <span\n class=\"text-xs font-medium px-3 cursor-pointer inline-flex items-center gap-1\"\n #inlineTenantTrigger\n >\n {{ ((tenant$ | async)?.title | translate | async) ?? '' }}\n <i class=\"fa-solid fa-caret-down text-2xs opacity-60\"></i>\n </span>\n <ax-popover\n [target]=\"inlineTenantTrigger\"\n [openOn]=\"'toggle'\"\n [closeOn]=\"'clickOut'\"\n [adaptivityEnabled]=\"true\"\n #tenantPopover\n >\n <div [class]=\"popupPanelClass\">\n <axp-tenant-chooser-list\n [simple]=\"true\"\n (tenantChosen)=\"closePopover()\"\n ></axp-tenant-chooser-list>\n </div>\n </ax-popover>\n } @else {\n <!-- ----- Plain text for single tenant ----- -->\n <span class=\"text-xs font-medium px-3\">\n {{ ((tenant$ | async)?.title | translate | async) ?? '' }}\n </span>\n }\n } @else {\n @if (tenants.length > 1) {\n <ax-button\n [text]=\"((tenant$ | async)?.title | translate | async) ?? ''\"\n look=\"blank\"\n #tenantChooser\n >\n <ax-suffix>\n <ax-icon class=\"fa-solid fa-caret-down\"></ax-icon>\n </ax-suffix>\n </ax-button>\n <ax-popover\n [target]=\"tenantChooser\"\n [openOn]=\"'toggle'\"\n [closeOn]=\"'clickOut'\"\n [adaptivityEnabled]=\"true\"\n #tenantPopover\n >\n <div [class]=\"popupPanelClass\">\n <axp-tenant-chooser-list\n [simple]=\"true\"\n (tenantChosen)=\"closePopover()\"\n ></axp-tenant-chooser-list>\n </div>\n </ax-popover>\n } @else {\n <ax-button\n [text]=\"((tenant$ | async)?.title | translate | async) ?? ''\"\n class=\"ax-sm\"\n look=\"blank\"\n ></ax-button>\n }\n }\n}\n" }]
1514
1517
  }], propDecorators: { tenantPopover: [{ type: i0.ViewChild, args: ['tenantPopover', { isSignal: true }] }], inline: [{
1515
1518
  type: Input
1516
1519
  }] } });
@@ -1536,6 +1539,7 @@ class AXMAuthProfileSlotComponent {
1536
1539
  this.shortcutRegistry = inject(AXPKeyboardShortcutRegistry);
1537
1540
  this.settingsService = inject(AXPSettingsService);
1538
1541
  this.destroyRef = inject(DestroyRef);
1542
+ this.deviceService = inject(AXPDeviceService);
1539
1543
  //#endregion
1540
1544
  //#region ---- State ----
1541
1545
  this.isDarkMode = this.themeService.isDarkMode;
@@ -1639,14 +1643,14 @@ class AXMAuthProfileSlotComponent {
1639
1643
  }
1640
1644
  }
1641
1645
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMAuthProfileSlotComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1642
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXMAuthProfileSlotComponent, isStandalone: true, selector: "ng-component", ngImport: i0, template: "@if (isAuthenticated$ | async) {\n <div class=\"size-fit\">\n <div #avatar>\n <axp-user-avatar\n [size]=\"36\"\n [userId]=\"$safeNavigationMigration((user$ | async)?.id)!\"\n [showPresence]=\"true\"\n ></axp-user-avatar>\n </div>\n\n <ax-popover\n [target]=\"avatar\"\n [openOn]=\"'toggle'\"\n [closeOn]=\"'clickOut'\"\n [adaptivityEnabled]=\"false\"\n #p\n >\n <div\n class=\"bg-lightest border border-lightest rounded-md shadow-md w-80\"\n >\n <div class=\"flex flex-col items-center p-4 border-b\">\n <axp-user-avatar\n [size]=\"64\"\n [userId]=\"$safeNavigationMigration((user$ | async)?.id)!\"\n [showPresence]=\"false\"\n ></axp-user-avatar>\n\n <div class=\"flex flex-col items-center justify-center mt-2\">\n <div class=\"text-base font-bold \">{{ (user$ | async)?.title }}</div>\n <axp-tenant-chooser-dropdown class=\"mt-1\"></axp-tenant-chooser-dropdown>\n </div>\n </div>\n <div class=\"axp-profile-slot-menus\">\n <ul>\n @for (item of menuItems(); track item.name ?? item.title) {\n @if (item.visible != false) {\n @if (hasProfileSlotMenuBreakBefore(item.break)) {\n <li class=\"axp-profile-slot-menu-break\" role=\"separator\"></li>\n }\n <li [class]=\"menuItemClass(item)\">\n <a (click)=\"handleMenuItemClick(item, p)\">\n <i [class]=\"item.icon\"></i>\n <span class=\"flex-1\">{{\n item.title | translate | async\n }}</span>\n </a>\n </li>\n @if (hasProfileSlotMenuBreakAfter(item.break)) {\n <li class=\"axp-profile-slot-menu-break\" role=\"separator\"></li>\n }\n }\n }\n </ul>\n </div>\n </div>\n </ax-popover>\n </div>\n} @else {\n <ax-button\n color=\"default\"\n look=\"blank\"\n text=\"Sign Up / Sign In\"\n (click)=\"handleSignIn()\"\n >\n <ax-icon>\n <i class=\"fa-solid fa-user text-slate-400 dark:text-slate-200\"></i>\n </ax-icon>\n </ax-button>\n}\n", styles: ["@layer properties;.axp-profile-slot-menus ul{margin-top:calc(var(--spacing, .25rem) * 2);display:flex;flex-direction:column;gap:var(--spacing, .25rem);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--color-border-default);padding-inline:calc(var(--spacing, .25rem) * 2)}.axp-profile-slot-menus ul:last-child{border-style:var(--tw-border-style);border-width:0px}.axp-profile-slot-menus ul li{display:flex;cursor:pointer;border-radius:var(--radius-md, .375rem)}.axp-profile-slot-menus ul li:last-child{margin-bottom:calc(var(--spacing, .25rem) * 2)}.axp-profile-slot-menus ul li:hover{background-color:rgba(var(--ax-sys-color-dark-surface))}.axp-profile-slot-menus ul li.axp-profile-slot-menu-break{pointer-events:none;margin-inline:calc(var(--spacing, .25rem) * 2);margin-block:var(--spacing, .25rem);height:0px;min-height:0px;cursor:default;border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--color-border-default);padding:0}.axp-profile-slot-menus ul li.axp-profile-slot-menu-break:hover{background-color:transparent}.axp-profile-slot-menus ul li i{margin-inline-end:calc(var(--spacing, .25rem) * 3);display:grid;height:calc(var(--spacing, .25rem) * 6);width:calc(var(--spacing, .25rem) * 6);place-items:center;font-size:var(--text-xl, 1.25rem);line-height:var(--tw-leading, var(--text-xl--line-height, calc(1.75 / 1.25)))}.axp-profile-slot-menus ul li a{display:flex;height:100%;width:100%;align-items:center;gap:calc(var(--spacing, .25rem) * 2);padding:calc(var(--spacing, .25rem) * 2)}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: RouterModule }, { kind: "ngmodule", type:
1646
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXMAuthProfileSlotComponent, isStandalone: true, selector: "ng-component", ngImport: i0, template: "@if (isAuthenticated$ | async) {\n <div class=\"size-fit\">\n <div #avatar>\n <axp-user-avatar\n [size]=\"36\"\n [userId]=\"$safeNavigationMigration((user$ | async)?.id)!\"\n [showPresence]=\"true\"\n ></axp-user-avatar>\n </div>\n\n <ax-popover\n [target]=\"avatar\"\n [openOn]=\"'toggle'\"\n [closeOn]=\"'clickOut'\"\n [adaptivityEnabled]=\"false\"\n #p\n >\n <div\n class=\"bg-lightest border border-lightest rounded-md shadow-md w-80\"\n >\n <div class=\"flex flex-col items-center p-4 border-b\">\n <axp-user-avatar\n [size]=\"64\"\n [userId]=\"$safeNavigationMigration((user$ | async)?.id)!\"\n [showPresence]=\"false\"\n ></axp-user-avatar>\n\n <div class=\"flex flex-col items-center justify-center mt-2\">\n <div class=\"text-base font-bold \">{{ (user$ | async)?.title }}</div>\n @if (!deviceService.isSmall()) {\n <axp-tenant-chooser-dropdown class=\"mt-1\"></axp-tenant-chooser-dropdown>\n }\n </div>\n </div>\n <div class=\"axp-profile-slot-menus\">\n <ul>\n @for (item of menuItems(); track item.name ?? item.title) {\n @if (item.visible != false) {\n @if (hasProfileSlotMenuBreakBefore(item.break)) {\n <li class=\"axp-profile-slot-menu-break\" role=\"separator\"></li>\n }\n <li [class]=\"menuItemClass(item)\">\n <a (click)=\"handleMenuItemClick(item, p)\">\n <i [class]=\"item.icon\"></i>\n <span class=\"flex-1\">{{\n item.title | translate | async\n }}</span>\n </a>\n </li>\n @if (hasProfileSlotMenuBreakAfter(item.break)) {\n <li class=\"axp-profile-slot-menu-break\" role=\"separator\"></li>\n }\n }\n }\n </ul>\n </div>\n </div>\n </ax-popover>\n </div>\n} @else {\n <ax-button\n color=\"default\"\n look=\"blank\"\n text=\"Sign Up / Sign In\"\n (click)=\"handleSignIn()\"\n >\n <ax-icon>\n <i class=\"fa-solid fa-user text-slate-400 dark:text-slate-200\"></i>\n </ax-icon>\n </ax-button>\n}\n", styles: ["@layer properties;.axp-profile-slot-menus ul{margin-top:calc(var(--spacing, .25rem) * 2);display:flex;flex-direction:column;gap:var(--spacing, .25rem);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--color-border-default);padding-inline:calc(var(--spacing, .25rem) * 2)}.axp-profile-slot-menus ul:last-child{border-style:var(--tw-border-style);border-width:0px}.axp-profile-slot-menus ul li{display:flex;cursor:pointer;border-radius:var(--radius-md, .375rem)}.axp-profile-slot-menus ul li:last-child{margin-bottom:calc(var(--spacing, .25rem) * 2)}.axp-profile-slot-menus ul li:hover{background-color:rgba(var(--ax-sys-color-dark-surface))}.axp-profile-slot-menus ul li.axp-profile-slot-menu-break{pointer-events:none;margin-inline:calc(var(--spacing, .25rem) * 2);margin-block:var(--spacing, .25rem);height:0px;min-height:0px;cursor:default;border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--color-border-default);padding:0}.axp-profile-slot-menus ul li.axp-profile-slot-menu-break:hover{background-color:transparent}.axp-profile-slot-menus ul li i{margin-inline-end:calc(var(--spacing, .25rem) * 3);display:grid;height:calc(var(--spacing, .25rem) * 6);width:calc(var(--spacing, .25rem) * 6);place-items:center;font-size:var(--text-xl, 1.25rem);line-height:var(--tw-leading, var(--text-xl--line-height, calc(1.75 / 1.25)))}.axp-profile-slot-menus ul li a{display:flex;height:100%;width:100%;align-items:center;gap:calc(var(--spacing, .25rem) * 2);padding:calc(var(--spacing, .25rem) * 2)}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: RouterModule }, { kind: "ngmodule", type:
1643
1647
  //
1644
- AXImageModule }, { kind: "ngmodule", type: AXAvatarModule }, { kind: "ngmodule", type: AXPopoverModule }, { kind: "component", type: i2$1.AXPopoverComponent, selector: "ax-popover", inputs: ["width", "disablePanelClass", "visualContextScope", "disabled", "offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "closeOnScroll", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i3$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "ngmodule", type:
1648
+ AXImageModule }, { kind: "ngmodule", type: AXAvatarModule }, { kind: "ngmodule", type: AXPopoverModule }, { kind: "component", type: i2$1.AXPopoverComponent, selector: "ax-popover", inputs: ["width", "disablePanelClass", "visualContextScope", "disabled", "offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "closeOnScroll", "closeOnNavigation", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2$2.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "ngmodule", type:
1645
1649
  // AXKBDComponent,
1646
1650
  // AXKBDItemComponent,
1647
1651
  AXLoadingModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "component", type: AXPUserAvatarComponent, selector: "axp-user-avatar", inputs: ["size", "userId", "showPresence", "displayName", "displayAvatar"] }, { kind: "component", type:
1648
1652
  //
1649
- AXPTenantChooserDropdownComponent, selector: "axp-tenant-chooser-dropdown", inputs: ["inline"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i5$1.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
1653
+ AXPTenantChooserDropdownComponent, selector: "axp-tenant-chooser-dropdown", inputs: ["inline"] }, { kind: "pipe", type: i3$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
1650
1654
  }
1651
1655
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMAuthProfileSlotComponent, decorators: [{
1652
1656
  type: Component,
@@ -1666,7 +1670,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
1666
1670
  AXPUserAvatarComponent,
1667
1671
  //
1668
1672
  AXPTenantChooserDropdownComponent,
1669
- ], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "@if (isAuthenticated$ | async) {\n <div class=\"size-fit\">\n <div #avatar>\n <axp-user-avatar\n [size]=\"36\"\n [userId]=\"$safeNavigationMigration((user$ | async)?.id)!\"\n [showPresence]=\"true\"\n ></axp-user-avatar>\n </div>\n\n <ax-popover\n [target]=\"avatar\"\n [openOn]=\"'toggle'\"\n [closeOn]=\"'clickOut'\"\n [adaptivityEnabled]=\"false\"\n #p\n >\n <div\n class=\"bg-lightest border border-lightest rounded-md shadow-md w-80\"\n >\n <div class=\"flex flex-col items-center p-4 border-b\">\n <axp-user-avatar\n [size]=\"64\"\n [userId]=\"$safeNavigationMigration((user$ | async)?.id)!\"\n [showPresence]=\"false\"\n ></axp-user-avatar>\n\n <div class=\"flex flex-col items-center justify-center mt-2\">\n <div class=\"text-base font-bold \">{{ (user$ | async)?.title }}</div>\n <axp-tenant-chooser-dropdown class=\"mt-1\"></axp-tenant-chooser-dropdown>\n </div>\n </div>\n <div class=\"axp-profile-slot-menus\">\n <ul>\n @for (item of menuItems(); track item.name ?? item.title) {\n @if (item.visible != false) {\n @if (hasProfileSlotMenuBreakBefore(item.break)) {\n <li class=\"axp-profile-slot-menu-break\" role=\"separator\"></li>\n }\n <li [class]=\"menuItemClass(item)\">\n <a (click)=\"handleMenuItemClick(item, p)\">\n <i [class]=\"item.icon\"></i>\n <span class=\"flex-1\">{{\n item.title | translate | async\n }}</span>\n </a>\n </li>\n @if (hasProfileSlotMenuBreakAfter(item.break)) {\n <li class=\"axp-profile-slot-menu-break\" role=\"separator\"></li>\n }\n }\n }\n </ul>\n </div>\n </div>\n </ax-popover>\n </div>\n} @else {\n <ax-button\n color=\"default\"\n look=\"blank\"\n text=\"Sign Up / Sign In\"\n (click)=\"handleSignIn()\"\n >\n <ax-icon>\n <i class=\"fa-solid fa-user text-slate-400 dark:text-slate-200\"></i>\n </ax-icon>\n </ax-button>\n}\n", styles: ["@layer properties;.axp-profile-slot-menus ul{margin-top:calc(var(--spacing, .25rem) * 2);display:flex;flex-direction:column;gap:var(--spacing, .25rem);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--color-border-default);padding-inline:calc(var(--spacing, .25rem) * 2)}.axp-profile-slot-menus ul:last-child{border-style:var(--tw-border-style);border-width:0px}.axp-profile-slot-menus ul li{display:flex;cursor:pointer;border-radius:var(--radius-md, .375rem)}.axp-profile-slot-menus ul li:last-child{margin-bottom:calc(var(--spacing, .25rem) * 2)}.axp-profile-slot-menus ul li:hover{background-color:rgba(var(--ax-sys-color-dark-surface))}.axp-profile-slot-menus ul li.axp-profile-slot-menu-break{pointer-events:none;margin-inline:calc(var(--spacing, .25rem) * 2);margin-block:var(--spacing, .25rem);height:0px;min-height:0px;cursor:default;border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--color-border-default);padding:0}.axp-profile-slot-menus ul li.axp-profile-slot-menu-break:hover{background-color:transparent}.axp-profile-slot-menus ul li i{margin-inline-end:calc(var(--spacing, .25rem) * 3);display:grid;height:calc(var(--spacing, .25rem) * 6);width:calc(var(--spacing, .25rem) * 6);place-items:center;font-size:var(--text-xl, 1.25rem);line-height:var(--tw-leading, var(--text-xl--line-height, calc(1.75 / 1.25)))}.axp-profile-slot-menus ul li a{display:flex;height:100%;width:100%;align-items:center;gap:calc(var(--spacing, .25rem) * 2);padding:calc(var(--spacing, .25rem) * 2)}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"] }]
1673
+ ], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "@if (isAuthenticated$ | async) {\n <div class=\"size-fit\">\n <div #avatar>\n <axp-user-avatar\n [size]=\"36\"\n [userId]=\"$safeNavigationMigration((user$ | async)?.id)!\"\n [showPresence]=\"true\"\n ></axp-user-avatar>\n </div>\n\n <ax-popover\n [target]=\"avatar\"\n [openOn]=\"'toggle'\"\n [closeOn]=\"'clickOut'\"\n [adaptivityEnabled]=\"false\"\n #p\n >\n <div\n class=\"bg-lightest border border-lightest rounded-md shadow-md w-80\"\n >\n <div class=\"flex flex-col items-center p-4 border-b\">\n <axp-user-avatar\n [size]=\"64\"\n [userId]=\"$safeNavigationMigration((user$ | async)?.id)!\"\n [showPresence]=\"false\"\n ></axp-user-avatar>\n\n <div class=\"flex flex-col items-center justify-center mt-2\">\n <div class=\"text-base font-bold \">{{ (user$ | async)?.title }}</div>\n @if (!deviceService.isSmall()) {\n <axp-tenant-chooser-dropdown class=\"mt-1\"></axp-tenant-chooser-dropdown>\n }\n </div>\n </div>\n <div class=\"axp-profile-slot-menus\">\n <ul>\n @for (item of menuItems(); track item.name ?? item.title) {\n @if (item.visible != false) {\n @if (hasProfileSlotMenuBreakBefore(item.break)) {\n <li class=\"axp-profile-slot-menu-break\" role=\"separator\"></li>\n }\n <li [class]=\"menuItemClass(item)\">\n <a (click)=\"handleMenuItemClick(item, p)\">\n <i [class]=\"item.icon\"></i>\n <span class=\"flex-1\">{{\n item.title | translate | async\n }}</span>\n </a>\n </li>\n @if (hasProfileSlotMenuBreakAfter(item.break)) {\n <li class=\"axp-profile-slot-menu-break\" role=\"separator\"></li>\n }\n }\n }\n </ul>\n </div>\n </div>\n </ax-popover>\n </div>\n} @else {\n <ax-button\n color=\"default\"\n look=\"blank\"\n text=\"Sign Up / Sign In\"\n (click)=\"handleSignIn()\"\n >\n <ax-icon>\n <i class=\"fa-solid fa-user text-slate-400 dark:text-slate-200\"></i>\n </ax-icon>\n </ax-button>\n}\n", styles: ["@layer properties;.axp-profile-slot-menus ul{margin-top:calc(var(--spacing, .25rem) * 2);display:flex;flex-direction:column;gap:var(--spacing, .25rem);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--color-border-default);padding-inline:calc(var(--spacing, .25rem) * 2)}.axp-profile-slot-menus ul:last-child{border-style:var(--tw-border-style);border-width:0px}.axp-profile-slot-menus ul li{display:flex;cursor:pointer;border-radius:var(--radius-md, .375rem)}.axp-profile-slot-menus ul li:last-child{margin-bottom:calc(var(--spacing, .25rem) * 2)}.axp-profile-slot-menus ul li:hover{background-color:rgba(var(--ax-sys-color-dark-surface))}.axp-profile-slot-menus ul li.axp-profile-slot-menu-break{pointer-events:none;margin-inline:calc(var(--spacing, .25rem) * 2);margin-block:var(--spacing, .25rem);height:0px;min-height:0px;cursor:default;border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--color-border-default);padding:0}.axp-profile-slot-menus ul li.axp-profile-slot-menu-break:hover{background-color:transparent}.axp-profile-slot-menus ul li i{margin-inline-end:calc(var(--spacing, .25rem) * 3);display:grid;height:calc(var(--spacing, .25rem) * 6);width:calc(var(--spacing, .25rem) * 6);place-items:center;font-size:var(--text-xl, 1.25rem);line-height:var(--tw-leading, var(--text-xl--line-height, calc(1.75 / 1.25)))}.axp-profile-slot-menus ul li a{display:flex;height:100%;width:100%;align-items:center;gap:calc(var(--spacing, .25rem) * 2);padding:calc(var(--spacing, .25rem) * 2)}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"] }]
1670
1674
  }] });
1671
1675
 
1672
1676
  class AXMUserProfileCardSlotComponent {
@@ -1681,6 +1685,9 @@ class AXMUserProfileCardSlotComponent {
1681
1685
  return this.themeStore.effectiveMenuVerticalMode() === AXPMenuVerticalMode.Compact;
1682
1686
  }, /* @ts-ignore */
1683
1687
  ...(ngDevMode ? [{ debugName: "isCompactMode" }] : /* istanbul ignore next */ []));
1688
+ /** Compact rail: match mark size; full menu keeps the larger profile avatar. */
1689
+ this.avatarSize = computed(() => (this.isCompactMode() ? 28 : 48), /* @ts-ignore */
1690
+ ...(ngDevMode ? [{ debugName: "avatarSize" }] : /* istanbul ignore next */ []));
1684
1691
  this.isMenuDark = computed(() => this.themeStore.menuDarkEnabled() ||
1685
1692
  (this.themeStore.menuAppearance() === 'brand-light' &&
1686
1693
  this.themeStore.isDarkMode()), /* @ts-ignore */
@@ -1711,6 +1718,10 @@ class AXMUserProfileCardSlotComponent {
1711
1718
  }
1712
1719
  async logOut() {
1713
1720
  await this.sessionService.signout();
1721
+ const path = (this.router.url ?? '').split('?')[0];
1722
+ if (!path.startsWith('/auth')) {
1723
+ await this.router.navigateByUrl('/auth/login', { replaceUrl: true });
1724
+ }
1714
1725
  }
1715
1726
  toggleProfileMenu() {
1716
1727
  this.profilePopover.open();
@@ -1742,9 +1753,9 @@ class AXMUserProfileCardSlotComponent {
1742
1753
  }
1743
1754
  }
1744
1755
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMUserProfileCardSlotComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1745
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXMUserProfileCardSlotComponent, isStandalone: true, selector: "ng-component", viewQueries: [{ propertyName: "profilePopover", first: true, predicate: ["profilePopover"], descendants: true }], ngImport: i0, template: "@if((isAuthenticated$ | async)) {\n<div\n class=\"p-3 flex items-center gap-1 border-b\"\n [class.border-white/7]=\"isMenuDark()\"\n [class.border-black/7]=\"!isMenuDark()\"\n [class.justify-center]=\"isCompactMode()\"\n>\n <div #avatar>\n <axp-user-avatar\n [size]=\"48\"\n [userId]=\"$safeNavigationMigration((user$ | async)?.id)!\"\n [showPresence]=\"false\"\n ></axp-user-avatar>\n </div>\n @if (!isCompactMode()) {\n <div class=\"flex flex-col\">\n <ax-title class=\"text-sm font-medium px-3\">{{ (user$ | async)?.title }}</ax-title>\n <axp-tenant-chooser-dropdown [inline]=\"true\" />\n </div>\n }\n</div>\n}\n", dependencies: [{ kind: "ngmodule", type: RouterModule }, { kind: "ngmodule", type:
1756
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXMUserProfileCardSlotComponent, isStandalone: true, selector: "ng-component", viewQueries: [{ propertyName: "profilePopover", first: true, predicate: ["profilePopover"], descendants: true }], ngImport: i0, template: "@if((isAuthenticated$ | async)) {\n<div\n class=\"flex items-center gap-1 border-b\"\n [class.p-3]=\"!isCompactMode()\"\n [class.py-2]=\"isCompactMode()\"\n [class.px-0]=\"isCompactMode()\"\n [class.border-white/7]=\"isMenuDark()\"\n [class.border-black/7]=\"!isMenuDark()\"\n [class.justify-center]=\"isCompactMode()\"\n>\n <div #avatar>\n <axp-user-avatar\n [size]=\"avatarSize()\"\n [userId]=\"$safeNavigationMigration((user$ | async)?.id)!\"\n [showPresence]=\"false\"\n ></axp-user-avatar>\n </div>\n @if (!isCompactMode()) {\n <div class=\"flex flex-col\">\n <ax-title class=\"text-sm font-medium px-3\">{{ (user$ | async)?.title }}</ax-title>\n <axp-tenant-chooser-dropdown [inline]=\"true\" />\n </div>\n }\n</div>\n}\n", dependencies: [{ kind: "ngmodule", type: RouterModule }, { kind: "ngmodule", type:
1746
1757
  //
1747
- AXImageModule }, { kind: "ngmodule", type: AXAvatarModule }, { kind: "ngmodule", type: AXPopoverModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i3$1.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "component", type:
1758
+ AXImageModule }, { kind: "ngmodule", type: AXAvatarModule }, { kind: "ngmodule", type: AXPopoverModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2$2.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "component", type:
1748
1759
  //
1749
1760
  AXPTenantChooserDropdownComponent, selector: "axp-tenant-chooser-dropdown", inputs: ["inline"] }, { kind: "component", type: AXPUserAvatarComponent, selector: "axp-user-avatar", inputs: ["size", "userId", "showPresence", "displayName", "displayAvatar"] }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
1750
1761
  }
@@ -1764,12 +1775,186 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
1764
1775
  AXPTenantChooserDropdownComponent,
1765
1776
  AsyncPipe,
1766
1777
  AXPUserAvatarComponent,
1767
- ], template: "@if((isAuthenticated$ | async)) {\n<div\n class=\"p-3 flex items-center gap-1 border-b\"\n [class.border-white/7]=\"isMenuDark()\"\n [class.border-black/7]=\"!isMenuDark()\"\n [class.justify-center]=\"isCompactMode()\"\n>\n <div #avatar>\n <axp-user-avatar\n [size]=\"48\"\n [userId]=\"$safeNavigationMigration((user$ | async)?.id)!\"\n [showPresence]=\"false\"\n ></axp-user-avatar>\n </div>\n @if (!isCompactMode()) {\n <div class=\"flex flex-col\">\n <ax-title class=\"text-sm font-medium px-3\">{{ (user$ | async)?.title }}</ax-title>\n <axp-tenant-chooser-dropdown [inline]=\"true\" />\n </div>\n }\n</div>\n}\n" }]
1778
+ ], template: "@if((isAuthenticated$ | async)) {\n<div\n class=\"flex items-center gap-1 border-b\"\n [class.p-3]=\"!isCompactMode()\"\n [class.py-2]=\"isCompactMode()\"\n [class.px-0]=\"isCompactMode()\"\n [class.border-white/7]=\"isMenuDark()\"\n [class.border-black/7]=\"!isMenuDark()\"\n [class.justify-center]=\"isCompactMode()\"\n>\n <div #avatar>\n <axp-user-avatar\n [size]=\"avatarSize()\"\n [userId]=\"$safeNavigationMigration((user$ | async)?.id)!\"\n [showPresence]=\"false\"\n ></axp-user-avatar>\n </div>\n @if (!isCompactMode()) {\n <div class=\"flex flex-col\">\n <ax-title class=\"text-sm font-medium px-3\">{{ (user$ | async)?.title }}</ax-title>\n <axp-tenant-chooser-dropdown [inline]=\"true\" />\n </div>\n }\n</div>\n}\n" }]
1768
1779
  }], ctorParameters: () => [], propDecorators: { profilePopover: [{
1769
1780
  type: ViewChild,
1770
1781
  args: ['profilePopover']
1771
1782
  }] } });
1772
1783
 
1784
+ //#region ----- Imports -----
1785
+ //#endregion
1786
+ //#region ----- PWA install -----
1787
+ /**
1788
+ * Captures Chromium `beforeinstallprompt` as soon as startup runs, so the install
1789
+ * page still has a deferred prompt if the event fired before navigation.
1790
+ */
1791
+ class AXPPwaInstallService {
1792
+ constructor() {
1793
+ //#region ----- Services & Dependencies -----
1794
+ this.destroyRef = inject(DestroyRef);
1795
+ //#endregion
1796
+ //#region ----- State Signals -----
1797
+ this.installedSignal = signal(false, /* @ts-ignore */
1798
+ ...(ngDevMode ? [{ debugName: "installedSignal" }] : /* istanbul ignore next */ []));
1799
+ this.canPromptSignal = signal(false, /* @ts-ignore */
1800
+ ...(ngDevMode ? [{ debugName: "canPromptSignal" }] : /* istanbul ignore next */ []));
1801
+ this.iosSignal = signal(false, /* @ts-ignore */
1802
+ ...(ngDevMode ? [{ debugName: "iosSignal" }] : /* istanbul ignore next */ []));
1803
+ this.dismissedSignal = signal(readPromptDismissed(), /* @ts-ignore */
1804
+ ...(ngDevMode ? [{ debugName: "dismissedSignal" }] : /* istanbul ignore next */ []));
1805
+ this.deferredPrompt = null;
1806
+ this.started = false;
1807
+ this.installed = this.installedSignal.asReadonly();
1808
+ this.canPrompt = this.canPromptSignal.asReadonly();
1809
+ this.ios = this.iosSignal.asReadonly();
1810
+ this.dismissed = this.dismissedSignal.asReadonly();
1811
+ this.showPrompt = computed(() => !this.installedSignal() && !this.dismissedSignal(), /* @ts-ignore */
1812
+ ...(ngDevMode ? [{ debugName: "showPrompt" }] : /* istanbul ignore next */ []));
1813
+ this.offerInProfile = computed(() => !this.installedSignal(), /* @ts-ignore */
1814
+ ...(ngDevMode ? [{ debugName: "offerInProfile" }] : /* istanbul ignore next */ []));
1815
+ this.promptHostClaimed = false;
1816
+ }
1817
+ //#endregion
1818
+ //#region ----- Public API -----
1819
+ start() {
1820
+ if (this.started || typeof window === 'undefined') {
1821
+ return;
1822
+ }
1823
+ this.started = true;
1824
+ this.installedSignal.set(isStandaloneDisplay());
1825
+ this.iosSignal.set(isIosSafari() && !isStandaloneDisplay());
1826
+ const onBeforeInstall = (event) => {
1827
+ event.preventDefault();
1828
+ this.deferredPrompt = event;
1829
+ this.canPromptSignal.set(true);
1830
+ };
1831
+ const onInstalled = () => {
1832
+ this.deferredPrompt = null;
1833
+ this.canPromptSignal.set(false);
1834
+ this.installedSignal.set(true);
1835
+ this.iosSignal.set(false);
1836
+ this.dismissPrompt();
1837
+ };
1838
+ const onDisplayMode = () => {
1839
+ const standalone = isStandaloneDisplay();
1840
+ this.installedSignal.set(standalone);
1841
+ if (standalone) {
1842
+ this.iosSignal.set(false);
1843
+ }
1844
+ };
1845
+ window.addEventListener('beforeinstallprompt', onBeforeInstall);
1846
+ window.addEventListener('appinstalled', onInstalled);
1847
+ const displayQuery = window.matchMedia('(display-mode: standalone)');
1848
+ displayQuery.addEventListener('change', onDisplayMode);
1849
+ this.destroyRef.onDestroy(() => {
1850
+ window.removeEventListener('beforeinstallprompt', onBeforeInstall);
1851
+ window.removeEventListener('appinstalled', onInstalled);
1852
+ displayQuery.removeEventListener('change', onDisplayMode);
1853
+ });
1854
+ }
1855
+ dismissPrompt() {
1856
+ this.dismissedSignal.set(true);
1857
+ persistPromptDismissed();
1858
+ }
1859
+ claimPromptHost() {
1860
+ if (this.promptHostClaimed) {
1861
+ return false;
1862
+ }
1863
+ this.promptHostClaimed = true;
1864
+ return true;
1865
+ }
1866
+ async promptInstall() {
1867
+ const promptEvent = this.deferredPrompt;
1868
+ if (!promptEvent) {
1869
+ return 'unavailable';
1870
+ }
1871
+ await promptEvent.prompt();
1872
+ const choice = await promptEvent.userChoice;
1873
+ this.deferredPrompt = null;
1874
+ this.canPromptSignal.set(false);
1875
+ if (choice.outcome === 'accepted') {
1876
+ this.installedSignal.set(true);
1877
+ }
1878
+ return choice.outcome;
1879
+ }
1880
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPPwaInstallService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1881
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPPwaInstallService, providedIn: 'root' }); }
1882
+ }
1883
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPPwaInstallService, decorators: [{
1884
+ type: Injectable,
1885
+ args: [{ providedIn: 'root' }]
1886
+ }] });
1887
+ //#endregion
1888
+ //#region ----- Helpers -----
1889
+ function isStandaloneDisplay() {
1890
+ if (typeof window === 'undefined') {
1891
+ return false;
1892
+ }
1893
+ const navigatorStandalone = navigator.standalone === true;
1894
+ return (navigatorStandalone ||
1895
+ window.matchMedia('(display-mode: standalone)').matches ||
1896
+ window.matchMedia('(display-mode: window-controls-overlay)').matches);
1897
+ }
1898
+ const PWA_INSTALL_PROMPT_DISMISSED_KEY = 'axp:pwa-install-prompt-dismissed';
1899
+ function readPromptDismissed() {
1900
+ if (typeof window === 'undefined') {
1901
+ return false;
1902
+ }
1903
+ try {
1904
+ return window.localStorage.getItem(PWA_INSTALL_PROMPT_DISMISSED_KEY) === '1';
1905
+ }
1906
+ catch {
1907
+ return false;
1908
+ }
1909
+ }
1910
+ function persistPromptDismissed() {
1911
+ if (typeof window === 'undefined') {
1912
+ return;
1913
+ }
1914
+ try {
1915
+ window.localStorage.setItem(PWA_INSTALL_PROMPT_DISMISSED_KEY, '1');
1916
+ }
1917
+ catch {
1918
+ // Private mode or blocked storage; in-memory dismiss still applies for this session.
1919
+ }
1920
+ }
1921
+ function isIosSafari() {
1922
+ if (typeof navigator === 'undefined') {
1923
+ return false;
1924
+ }
1925
+ const ua = navigator.userAgent;
1926
+ const iPhone = /iPhone|iPad|iPod/i.test(ua);
1927
+ const iPadOs = navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1;
1928
+ return iPhone || iPadOs;
1929
+ }
1930
+
1931
+ //#region ----- Imports -----
1932
+ //#endregion
1933
+ //#region ----- Component -----
1934
+ class AXMPwaInstallPromptComponent {
1935
+ constructor() {
1936
+ //#region ----- Services & Dependencies -----
1937
+ this.router = inject(Router);
1938
+ this.pwaInstall = inject(AXPPwaInstallService);
1939
+ this.isPromptHost = this.pwaInstall.claimPromptHost();
1940
+ }
1941
+ //#endregion
1942
+ //#region ----- Event Handlers -----
1943
+ handleOpenInstallPage() {
1944
+ this.pwaInstall.dismissPrompt();
1945
+ void this.router.navigateByUrl('/auth/install');
1946
+ }
1947
+ handleDismiss() {
1948
+ this.pwaInstall.dismissPrompt();
1949
+ }
1950
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMPwaInstallPromptComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1951
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXMPwaInstallPromptComponent, isStandalone: true, selector: "axm-pwa-install-prompt", ngImport: i0, template: "@if (isPromptHost && pwaInstall.showPrompt()) {\n <!-- ----- Corner install suggestion while the app is not installed ----- -->\n <div\n class=\"axp-pwa-install-prompt\"\n role=\"region\"\n [attr.aria-label]=\"'@auth:pwa-install.prompt.title' | translate | async\"\n >\n <ax-button\n class=\"axp-pwa-install-prompt__dismiss\"\n look=\"blank\"\n [iconOnly]=\"true\"\n [attr.aria-label]=\"'@auth:pwa-install.prompt.dismiss' | translate | async\"\n (onClick)=\"handleDismiss()\"\n >\n <ax-prefix>\n <ax-icon icon=\"fa-light fa-xmark\"></ax-icon>\n </ax-prefix>\n </ax-button>\n <div class=\"axp-pwa-install-prompt__copy\">\n <p class=\"font-semibold\">{{ '@auth:pwa-install.prompt.title' | translate | async }}</p>\n <p class=\"text-sm text-neutral-600\">{{ '@auth:pwa-install.prompt.hint' | translate | async }}</p>\n </div>\n <ax-button\n color=\"primary\"\n class=\"w-full\"\n [text]=\"'@auth:pwa-install.prompt.action' | translate | async\"\n (onClick)=\"handleOpenInstallPage()\"\n ></ax-button>\n </div>\n}\n", styles: ["@layer properties;:host{display:contents}.axp-pwa-install-prompt{position:fixed;z-index:40;display:flex;flex-direction:column;gap:calc(var(--spacing, .25rem) * 3);border-radius:var(--radius-lg, .5rem);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-border-default);background-color:rgba(var(--ax-sys-color-lightest-surface));padding:calc(var(--spacing, .25rem) * 4);--tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);inset-inline-end:1.5rem;bottom:1.5rem;width:min(20rem,calc(100vw - 2rem))}.axp-pwa-install-prompt__dismiss{position:absolute;inset-inline-end:calc(var(--spacing, .25rem) * 2);top:calc(var(--spacing, .25rem) * 2)}.axp-pwa-install-prompt__copy{padding-inline-end:calc(var(--spacing, .25rem) * 8);text-align:start}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-inset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-inset-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-ring-color{syntax: \"*\"; inherits: false;}@property --tw-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-ring-color{syntax: \"*\"; inherits: false;}@property --tw-inset-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-ring-inset{syntax: \"*\"; inherits: false;}@property --tw-ring-offset-width{syntax: \"<length>\"; inherits: false; initial-value: 0px;}@property --tw-ring-offset-color{syntax: \"*\"; inherits: false; initial-value: #fff;}@property --tw-ring-offset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid;--tw-shadow: 0 0 #0000;--tw-shadow-color: initial;--tw-shadow-alpha: 100%;--tw-inset-shadow: 0 0 #0000;--tw-inset-shadow-color: initial;--tw-inset-shadow-alpha: 100%;--tw-ring-color: initial;--tw-ring-shadow: 0 0 #0000;--tw-inset-ring-color: initial;--tw-inset-ring-shadow: 0 0 #0000;--tw-ring-inset: initial;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-offset-shadow: 0 0 #0000}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2$2.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i2$2.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i5.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1952
+ }
1953
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMPwaInstallPromptComponent, decorators: [{
1954
+ type: Component,
1955
+ args: [{ selector: 'axm-pwa-install-prompt', changeDetection: ChangeDetectionStrategy.OnPush, imports: [AXButtonModule, AXDecoratorModule, AXTranslationModule, AsyncPipe], template: "@if (isPromptHost && pwaInstall.showPrompt()) {\n <!-- ----- Corner install suggestion while the app is not installed ----- -->\n <div\n class=\"axp-pwa-install-prompt\"\n role=\"region\"\n [attr.aria-label]=\"'@auth:pwa-install.prompt.title' | translate | async\"\n >\n <ax-button\n class=\"axp-pwa-install-prompt__dismiss\"\n look=\"blank\"\n [iconOnly]=\"true\"\n [attr.aria-label]=\"'@auth:pwa-install.prompt.dismiss' | translate | async\"\n (onClick)=\"handleDismiss()\"\n >\n <ax-prefix>\n <ax-icon icon=\"fa-light fa-xmark\"></ax-icon>\n </ax-prefix>\n </ax-button>\n <div class=\"axp-pwa-install-prompt__copy\">\n <p class=\"font-semibold\">{{ '@auth:pwa-install.prompt.title' | translate | async }}</p>\n <p class=\"text-sm text-neutral-600\">{{ '@auth:pwa-install.prompt.hint' | translate | async }}</p>\n </div>\n <ax-button\n color=\"primary\"\n class=\"w-full\"\n [text]=\"'@auth:pwa-install.prompt.action' | translate | async\"\n (onClick)=\"handleOpenInstallPage()\"\n ></ax-button>\n </div>\n}\n", styles: ["@layer properties;:host{display:contents}.axp-pwa-install-prompt{position:fixed;z-index:40;display:flex;flex-direction:column;gap:calc(var(--spacing, .25rem) * 3);border-radius:var(--radius-lg, .5rem);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-border-default);background-color:rgba(var(--ax-sys-color-lightest-surface));padding:calc(var(--spacing, .25rem) * 4);--tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);inset-inline-end:1.5rem;bottom:1.5rem;width:min(20rem,calc(100vw - 2rem))}.axp-pwa-install-prompt__dismiss{position:absolute;inset-inline-end:calc(var(--spacing, .25rem) * 2);top:calc(var(--spacing, .25rem) * 2)}.axp-pwa-install-prompt__copy{padding-inline-end:calc(var(--spacing, .25rem) * 8);text-align:start}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-inset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-inset-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-ring-color{syntax: \"*\"; inherits: false;}@property --tw-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-ring-color{syntax: \"*\"; inherits: false;}@property --tw-inset-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-ring-inset{syntax: \"*\"; inherits: false;}@property --tw-ring-offset-width{syntax: \"<length>\"; inherits: false; initial-value: 0px;}@property --tw-ring-offset-color{syntax: \"*\"; inherits: false; initial-value: #fff;}@property --tw-ring-offset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid;--tw-shadow: 0 0 #0000;--tw-shadow-color: initial;--tw-shadow-alpha: 100%;--tw-inset-shadow: 0 0 #0000;--tw-inset-shadow-color: initial;--tw-inset-shadow-alpha: 100%;--tw-ring-color: initial;--tw-ring-shadow: 0 0 #0000;--tw-inset-ring-color: initial;--tw-inset-ring-shadow: 0 0 #0000;--tw-ring-inset: initial;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-offset-shadow: 0 0 #0000}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"] }]
1956
+ }] });
1957
+
1773
1958
  class AXMUserDeviceSessionsService {
1774
1959
  }
1775
1960
  class AXMUserDeviceSessionsServiceImp extends AXMUserDeviceSessionsService {
@@ -1904,9 +2089,8 @@ const canActivateTenantChooser = async (_route, _state) => {
1904
2089
  const tenants = await sessionService.getTenantsList();
1905
2090
  traceAuthGuard('Tenant chooser catalog', () => ({ count: tenants.length }));
1906
2091
  if (tenants.length === 0) {
1907
- window.alert('You do not have any tenant assigned to your account and cannot use the site. Please contact your administrator.');
1908
- // Stay on chooser rather than return false (cancels nav and sticks on prior login URL).
1909
- return true;
2092
+ traceAuthGuard('Tenant chooser → waiting room (no tenants)');
2093
+ return router.createUrlTree(['/auth/account/waiting-room']);
1910
2094
  }
1911
2095
  if (tenants.length === 1) {
1912
2096
  if (strategy && typeof strategy.updateToken === 'function') {
@@ -1980,24 +2164,442 @@ const canActivateAppChooser = async (_route, _state) => {
1980
2164
  };
1981
2165
  //#endregion
1982
2166
 
2167
+ //#region ----- Types -----
2168
+ /** Hook key for modules/apps to contribute welcome wizard steps. */
2169
+ const ONBOARDING_STEPS_HOOK = 'onboarding.steps';
2170
+ /** User-scoped settings key for welcome onboarding progress blob. */
2171
+ const ONBOARDING_WELCOME_SETTING_KEY = AXPAuthSettings.OnboardingWelcome;
2172
+ //#endregion
2173
+
2174
+ //#region ----- Progress service -----
2175
+ const EMPTY_PROGRESS = { steps: {} };
2176
+ class AXPOnboardingProgressService {
2177
+ constructor() {
2178
+ //#region ----- Services & Dependencies -----
2179
+ this.settingsService = inject(AXPSettingsService);
2180
+ }
2181
+ //#endregion
2182
+ //#region ----- Public API -----
2183
+ async getProgress() {
2184
+ const raw = await this.settingsService
2185
+ .scope(AXPPlatformScope.User)
2186
+ .get(ONBOARDING_WELCOME_SETTING_KEY);
2187
+ if (!raw || typeof raw !== 'object') {
2188
+ return { ...EMPTY_PROGRESS, steps: {} };
2189
+ }
2190
+ return {
2191
+ steps: raw.steps && typeof raw.steps === 'object' ? { ...raw.steps } : {},
2192
+ remindLaterUntil: raw.remindLaterUntil ?? null,
2193
+ dismissedPlanAt: raw.dismissedPlanAt ?? null,
2194
+ };
2195
+ }
2196
+ async setProgress(progress) {
2197
+ await this.settingsService.scope(AXPPlatformScope.User).set(ONBOARDING_WELCOME_SETTING_KEY, progress, {
2198
+ flush: true,
2199
+ });
2200
+ }
2201
+ isStepComplete(step, progress, context) {
2202
+ const entry = progress.steps[this.progressKey(step, context)];
2203
+ if (!entry || (entry.status !== 'completed' && entry.status !== 'skipped')) {
2204
+ return false;
2205
+ }
2206
+ switch (step.scope) {
2207
+ case 'user':
2208
+ return true;
2209
+ case 'tenant':
2210
+ return entry.tenantId === context.tenantId;
2211
+ case 'application':
2212
+ return entry.tenantId === context.tenantId && entry.applicationId === context.applicationId;
2213
+ default:
2214
+ return false;
2215
+ }
2216
+ }
2217
+ async markComplete(step, context, progress) {
2218
+ return this.markStatus(step, context, 'completed', progress);
2219
+ }
2220
+ async markSkipped(step, context, progress) {
2221
+ return this.markStatus(step, context, 'skipped', progress);
2222
+ }
2223
+ async setRemindLater(untilIso) {
2224
+ const progress = await this.getProgress();
2225
+ const next = {
2226
+ ...progress,
2227
+ remindLaterUntil: untilIso,
2228
+ };
2229
+ await this.setProgress(next);
2230
+ return next;
2231
+ }
2232
+ isSnoozed(progress, now = new Date()) {
2233
+ const until = progress.remindLaterUntil;
2234
+ if (!until) {
2235
+ return false;
2236
+ }
2237
+ const untilMs = Date.parse(until);
2238
+ if (Number.isNaN(untilMs)) {
2239
+ return false;
2240
+ }
2241
+ return now.getTime() < untilMs;
2242
+ }
2243
+ //#endregion
2244
+ //#region ----- Private helpers -----
2245
+ /** Stable progress map key so tenant/app completions do not overwrite each other. */
2246
+ progressKey(step, context) {
2247
+ switch (step.scope) {
2248
+ case 'tenant':
2249
+ return `${step.id}:${context.tenantId}`;
2250
+ case 'application':
2251
+ return `${step.id}:${context.tenantId}:${context.applicationId}`;
2252
+ case 'user':
2253
+ default:
2254
+ return step.id;
2255
+ }
2256
+ }
2257
+ async markStatus(step, context, status, progress) {
2258
+ const current = progress ?? (await this.getProgress());
2259
+ const entry = {
2260
+ status,
2261
+ at: new Date().toISOString(),
2262
+ scope: step.scope,
2263
+ };
2264
+ if (step.scope === 'tenant' || step.scope === 'application') {
2265
+ entry.tenantId = context.tenantId;
2266
+ }
2267
+ if (step.scope === 'application') {
2268
+ entry.applicationId = context.applicationId;
2269
+ }
2270
+ const next = {
2271
+ ...current,
2272
+ steps: {
2273
+ ...current.steps,
2274
+ [this.progressKey(step, context)]: entry,
2275
+ },
2276
+ remindLaterUntil: null,
2277
+ };
2278
+ await this.setProgress(next);
2279
+ return next;
2280
+ }
2281
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPOnboardingProgressService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
2282
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPOnboardingProgressService, providedIn: 'root' }); }
2283
+ }
2284
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPOnboardingProgressService, decorators: [{
2285
+ type: Injectable,
2286
+ args: [{ providedIn: 'root' }]
2287
+ }] });
2288
+
2289
+ //#region ----- Plan service -----
2290
+ class AXPOnboardingPlanService {
2291
+ constructor() {
2292
+ //#region ----- Services & Dependencies -----
2293
+ this.hooks = inject(AXPHookService);
2294
+ this.progressService = inject(AXPOnboardingProgressService);
2295
+ }
2296
+ //#endregion
2297
+ //#region ----- Public API -----
2298
+ /**
2299
+ * Runs the onboarding.steps hook waterfall and returns all contributed steps
2300
+ * sorted by priority (including already completed ones).
2301
+ */
2302
+ async assembleFullPlan(context) {
2303
+ const payload = await this.hooks.runAsync(ONBOARDING_STEPS_HOOK, {
2304
+ context,
2305
+ steps: [],
2306
+ });
2307
+ const steps = Array.isArray(payload.steps) ? [...payload.steps] : [];
2308
+ return steps.sort((a, b) => a.priority - b.priority);
2309
+ }
2310
+ /**
2311
+ * Runs the onboarding.steps hook waterfall, sorts by priority, and returns
2312
+ * only steps that are still incomplete for the given session context.
2313
+ */
2314
+ async assembleIncompletePlan(context) {
2315
+ const steps = await this.assembleFullPlan(context);
2316
+ const progress = await this.progressService.getProgress();
2317
+ return steps.filter((step) => !this.progressService.isStepComplete(step, progress, context));
2318
+ }
2319
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPOnboardingPlanService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
2320
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPOnboardingPlanService, providedIn: 'root' }); }
2321
+ }
2322
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPOnboardingPlanService, decorators: [{
2323
+ type: Injectable,
2324
+ args: [{ providedIn: 'root' }]
2325
+ }] });
2326
+
2327
+ //#region ----- Constants -----
2328
+ const WELCOME_ONBOARDING_ROUTE = '/auth/account/welcome-onboarding';
2329
+ const REMIND_LATER_HOURS = 24;
2330
+ /** User preference keys rendered on welcome preference steps. */
2331
+ const WELCOME_PREFERENCE_SETTING_KEYS = [
2332
+ AXPRegionalSetting.Language,
2333
+ AXPRegionalSetting.TimeZone,
2334
+ AXPThemeLayoutSetting.Mode,
2335
+ AXPThemeLayoutSetting.Palette,
2336
+ AXPThemeLayoutSetting.MenuOrientation,
2337
+ AXPThemeLayoutSetting.MenuVerticalMode,
2338
+ AXPThemeLayoutSetting.MenuBadgeVisible,
2339
+ AXPThemeLayoutSetting.MenuLookWithLine,
2340
+ AXPThemeLayoutSetting.MenuDensity,
2341
+ AXPThemeLayoutSetting.MenuDark,
2342
+ AXPThemeLayoutSetting.HeaderAppearance,
2343
+ AXPCommonSettings.NavigationMode,
2344
+ AXPCommonSettings.MaxOpenTabs,
2345
+ AXPThemeLayoutSetting.Font,
2346
+ AXPThemeLayoutSetting.FontSize,
2347
+ ];
2348
+ //#endregion
2349
+ //#region ----- Welcome onboarding flow -----
2350
+ /** Loads plan/preferences and builds per-step layout nodes for the welcome page. */
2351
+ class AXPWelcomeOnboardingFlowService {
2352
+ constructor() {
2353
+ //#region ----- Services & Dependencies -----
2354
+ this.layoutBuilder = inject(AXPLayoutBuilderService);
2355
+ this.sessionService = inject(AXPSessionService);
2356
+ this.planService = inject(AXPOnboardingPlanService);
2357
+ this.progressService = inject(AXPOnboardingProgressService);
2358
+ this.settingsService = inject(AXPSettingsService);
2359
+ this.settingDefinitions = inject(AXPSettingDefinitionProviderService);
2360
+ //#endregion
2361
+ //#region ----- State -----
2362
+ this.preferenceSettings = [];
2363
+ this.resumeContextKey = null;
2364
+ this.resumeStepId = null;
2365
+ }
2366
+ //#endregion
2367
+ //#region ----- Session & plan -----
2368
+ resolveContext() {
2369
+ const userId = this.sessionService.user?.id;
2370
+ const tenantId = this.sessionService.tenant?.id;
2371
+ const applicationId = this.sessionService.application?.id;
2372
+ if (!userId || !tenantId || !applicationId) {
2373
+ return null;
2374
+ }
2375
+ return { userId, tenantId, applicationId };
2376
+ }
2377
+ async evaluatePending(force) {
2378
+ const context = this.resolveContext();
2379
+ if (!context) {
2380
+ return null;
2381
+ }
2382
+ const progress = await this.progressService.getProgress();
2383
+ if (!force && this.progressService.isSnoozed(progress)) {
2384
+ return null;
2385
+ }
2386
+ const steps = await this.planService.assembleFullPlan(context);
2387
+ if (steps.length === 0) {
2388
+ return null;
2389
+ }
2390
+ const hasIncomplete = steps.some((step) => !this.progressService.isStepComplete(step, progress, context));
2391
+ if (!force && !hasIncomplete) {
2392
+ return null;
2393
+ }
2394
+ return { context, steps };
2395
+ }
2396
+ /** Index of the first step that is not completed/skipped for this session. */
2397
+ resolveFirstIncompleteStepIndex(steps, context, progress) {
2398
+ const index = steps.findIndex((step) => !this.progressService.isStepComplete(step, progress, context));
2399
+ return index >= 0 ? index : 0;
2400
+ }
2401
+ //#endregion
2402
+ //#region ----- Preferences -----
2403
+ async loadPreferenceContext() {
2404
+ this.preferenceSettings = await this.settingDefinitions.collectSettingsByKeys(AXPPlatformScope.User, WELCOME_PREFERENCE_SETTING_KEYS);
2405
+ const inheritedDefaults = await this.settingsService.defaultValues(AXPPlatformScope.User);
2406
+ const context = { ...inheritedDefaults };
2407
+ for (const setting of this.preferenceSettings) {
2408
+ const value = await this.settingsService.get(setting.name);
2409
+ if (value !== undefined && value !== null) {
2410
+ context[setting.name] = value;
2411
+ }
2412
+ }
2413
+ return context;
2414
+ }
2415
+ async savePreferences(formContext) {
2416
+ if (!formContext || this.preferenceSettings.length === 0) {
2417
+ return;
2418
+ }
2419
+ const values = {};
2420
+ for (const setting of this.preferenceSettings) {
2421
+ if (Object.prototype.hasOwnProperty.call(formContext, setting.name)) {
2422
+ values[setting.name] = formContext[setting.name];
2423
+ }
2424
+ }
2425
+ if (Object.keys(values).length === 0) {
2426
+ return;
2427
+ }
2428
+ await this.settingsService.scope(AXPPlatformScope.User).set(values, { flush: true });
2429
+ }
2430
+ //#endregion
2431
+ //#region ----- Resume (sub-flows e.g. change photo) -----
2432
+ contextKey(context) {
2433
+ return `${context.userId}:${context.tenantId}:${context.applicationId}`;
2434
+ }
2435
+ setResumeState(context, stepId) {
2436
+ this.resumeContextKey = this.contextKey(context);
2437
+ this.resumeStepId = stepId;
2438
+ }
2439
+ resolveResumeStepIndex(context, steps) {
2440
+ if (this.resumeContextKey !== this.contextKey(context) || !this.resumeStepId) {
2441
+ return 0;
2442
+ }
2443
+ const index = steps.findIndex((step) => step.id === this.resumeStepId);
2444
+ return index >= 0 ? index : 0;
2445
+ }
2446
+ clearResumeState() {
2447
+ this.resumeContextKey = null;
2448
+ this.resumeStepId = null;
2449
+ }
2450
+ hasActiveResumeState() {
2451
+ return this.resumeContextKey != null && this.resumeStepId != null;
2452
+ }
2453
+ //#endregion
2454
+ //#region ----- Progress -----
2455
+ async markStep(step, context, status) {
2456
+ if (status === 'completed') {
2457
+ await this.progressService.markComplete(step, context);
2458
+ return;
2459
+ }
2460
+ await this.progressService.markSkipped(step, context);
2461
+ }
2462
+ async markSteps(steps, context, status) {
2463
+ let progress = await this.progressService.getProgress();
2464
+ for (const step of steps) {
2465
+ progress =
2466
+ status === 'completed'
2467
+ ? await this.progressService.markComplete(step, context, progress)
2468
+ : await this.progressService.markSkipped(step, context, progress);
2469
+ }
2470
+ }
2471
+ async persistAll(steps, context, status) {
2472
+ let progress = await this.progressService.getProgress();
2473
+ for (const step of steps) {
2474
+ progress =
2475
+ status === 'completed'
2476
+ ? await this.progressService.markComplete(step, context, progress)
2477
+ : await this.progressService.markSkipped(step, context, progress);
2478
+ }
2479
+ }
2480
+ async setRemindLater() {
2481
+ const until = new Date(Date.now() + REMIND_LATER_HOURS * 60 * 60 * 1000).toISOString();
2482
+ await this.progressService.setRemindLater(until);
2483
+ }
2484
+ //#endregion
2485
+ //#region ----- Step layout -----
2486
+ buildStepLayout(step) {
2487
+ const builder = this.layoutBuilder.create();
2488
+ builder.flex((flex) => {
2489
+ flex
2490
+ .setDirection('column')
2491
+ .setGap('12px')
2492
+ .setAlignItems('stretch')
2493
+ .setJustifyContent('flex-start');
2494
+ const settingKeys = step.settingKeys ?? [];
2495
+ if (settingKeys.length > 0) {
2496
+ this.appendPreferenceFields(flex, settingKeys);
2497
+ }
2498
+ const actions = step.actions ?? [];
2499
+ if (actions.length > 0) {
2500
+ flex.flex((row) => {
2501
+ row.setDirection('row').setGap('8px').setWrap('wrap');
2502
+ for (const action of actions) {
2503
+ row.customWidget('button-action', {
2504
+ text: action.text,
2505
+ icon: action.icon,
2506
+ look: { id: 'outline' },
2507
+ color: { id: 'primary' },
2508
+ command: action.command,
2509
+ });
2510
+ }
2511
+ });
2512
+ }
2513
+ });
2514
+ return builder.build();
2515
+ }
2516
+ appendPreferenceFields(flex, settingKeys) {
2517
+ const settings = this.preferenceSettings.filter((setting) => settingKeys.includes(setting.name));
2518
+ for (const setting of settings) {
2519
+ flex.formField(setting.title, (formField) => {
2520
+ formField.path(setting.name);
2521
+ if (setting.description) {
2522
+ formField.setOptions({
2523
+ hint: setting.description,
2524
+ hintDisplayMode: 'note',
2525
+ });
2526
+ }
2527
+ const widgetOptions = { ...(setting.widget.options ?? {}) };
2528
+ const visibilityExpr = widgetOptions['visibility'];
2529
+ if (typeof visibilityExpr === 'string') {
2530
+ formField.visible(visibilityExpr);
2531
+ delete widgetOptions['visibility'];
2532
+ }
2533
+ formField.customWidget(setting.widget.type, {
2534
+ ...widgetOptions,
2535
+ ...(setting.isRequired ? { validations: [{ rule: 'required' }] } : {}),
2536
+ });
2537
+ });
2538
+ }
2539
+ }
2540
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPWelcomeOnboardingFlowService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
2541
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPWelcomeOnboardingFlowService, providedIn: 'root' }); }
2542
+ }
2543
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPWelcomeOnboardingFlowService, decorators: [{
2544
+ type: Injectable,
2545
+ args: [{ providedIn: 'root' }]
2546
+ }] });
2547
+
2548
+ //#region ----- Welcome onboarding route guard -----
2549
+ const canActivateWelcomeOnboarding = async (route) => {
2550
+ const sessionService = inject(AXPSessionService);
2551
+ const router = inject(Router);
2552
+ const flowService = inject(AXPWelcomeOnboardingFlowService);
2553
+ const homePageService = inject(AXPHomePageService);
2554
+ if (!sessionService.hasSessionCredentials()) {
2555
+ return router.createUrlTree(['/auth/login']);
2556
+ }
2557
+ if (!sessionService.tenant?.id) {
2558
+ return router.createUrlTree(['/auth/account/tenant-chooser']);
2559
+ }
2560
+ if (!sessionService.application?.id) {
2561
+ return router.createUrlTree(['/auth/account/app-chooser']);
2562
+ }
2563
+ const force = route.queryParamMap.get('force') === '1' || route.queryParamMap.get('force') === 'true';
2564
+ const pending = await flowService.evaluatePending(force);
2565
+ if (!pending) {
2566
+ if (flowService.hasActiveResumeState()) {
2567
+ return true;
2568
+ }
2569
+ return await homePageService.resolveAuthorizedHomeUrlTree();
2570
+ }
2571
+ return true;
2572
+ };
2573
+ //#endregion
2574
+
1983
2575
  function routesFacory() {
1984
2576
  let routes = [];
1985
2577
  routes = [
1986
2578
  {
1987
2579
  path: 'tenant-chooser',
1988
- loadComponent: () => import('./acorex-platform-module-auth-client-tenant-chooser.component-B8CNqHx5.mjs').then((c) => c.AXPAuthTenantChooserComponent),
2580
+ loadComponent: () => import('./acorex-platform-module-auth-client-tenant-chooser.component-DCdRCf1m.mjs').then((c) => c.AXPAuthTenantChooserComponent),
1989
2581
  canActivate: [AXPAuthGuard, canActivateTenantChooser],
1990
2582
  },
2583
+ {
2584
+ path: 'waiting-room',
2585
+ loadComponent: () => import('./acorex-platform-module-auth-client-waiting-room.component-IAVIt1fY.mjs').then((c) => c.AXPAuthWaitingRoomComponent),
2586
+ canActivate: [AXPAuthGuard],
2587
+ },
1991
2588
  {
1992
2589
  path: 'session-limit',
1993
- loadComponent: () => import('./acorex-platform-module-auth-client-session-limit.component-DH58dRba.mjs').then((c) => c.AXPAuthSessionLimitComponent),
2590
+ loadComponent: () => import('./acorex-platform-module-auth-client-session-limit.component-Dc6TIn-2.mjs').then((c) => c.AXPAuthSessionLimitComponent),
1994
2591
  canActivate: [AXPAuthGuard],
1995
2592
  },
1996
2593
  {
1997
2594
  path: 'app-chooser',
1998
- loadComponent: () => import('./acorex-platform-module-auth-client-app-chooser.component-CjWofUGR.mjs').then((c) => c.AXPAuthAppChooserComponent),
2595
+ loadComponent: () => import('./acorex-platform-module-auth-client-app-chooser.component-CLKLwWW8.mjs').then((c) => c.AXPAuthAppChooserComponent),
1999
2596
  canActivate: [AXPAuthGuard, canActivateAppChooser],
2000
2597
  },
2598
+ {
2599
+ path: 'welcome-onboarding',
2600
+ loadComponent: () => import('./acorex-platform-module-auth-client-welcome-onboarding-page.component-C2WYgv4l.mjs').then((c) => c.AXPAuthWelcomeOnboardingPageComponent),
2601
+ canActivate: [AXPAuthGuard, canActivateWelcomeOnboarding],
2602
+ },
2001
2603
  ];
2002
2604
  return routes;
2003
2605
  }
@@ -2022,6 +2624,20 @@ class AXPAccountModule {
2022
2624
  component: AXMUserProfileCardSlotComponent,
2023
2625
  },
2024
2626
  ],
2627
+ 'root-footer-end': [
2628
+ {
2629
+ priority: 20,
2630
+ name: 'pwa-install-prompt',
2631
+ component: AXMPwaInstallPromptComponent,
2632
+ },
2633
+ ],
2634
+ 'root-layout-overlay': [
2635
+ {
2636
+ priority: 10,
2637
+ name: 'pwa-install-prompt',
2638
+ component: AXMPwaInstallPromptComponent,
2639
+ },
2640
+ ],
2025
2641
  'root-header-end': [
2026
2642
  {
2027
2643
  priority: 98,
@@ -2049,6 +2665,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
2049
2665
  component: AXMUserProfileCardSlotComponent,
2050
2666
  },
2051
2667
  ],
2668
+ 'root-footer-end': [
2669
+ {
2670
+ priority: 20,
2671
+ name: 'pwa-install-prompt',
2672
+ component: AXMPwaInstallPromptComponent,
2673
+ },
2674
+ ],
2675
+ 'root-layout-overlay': [
2676
+ {
2677
+ priority: 10,
2678
+ name: 'pwa-install-prompt',
2679
+ component: AXMPwaInstallPromptComponent,
2680
+ },
2681
+ ],
2052
2682
  'root-header-end': [
2053
2683
  {
2054
2684
  priority: 98,
@@ -2383,7 +3013,7 @@ class AXPIdleLockService {
2383
3013
  this.overlayOpening = true;
2384
3014
  this.locked.set(true);
2385
3015
  try {
2386
- const { AXMSessionLockOverlayComponent: overlayComponent } = await import('./acorex-platform-module-auth-client-session-lock-overlay.component-cDCrwNRV.mjs');
3016
+ const { AXMSessionLockOverlayComponent: overlayComponent } = await import('./acorex-platform-module-auth-client-session-lock-overlay.component-ChigSAI-.mjs');
2387
3017
  const panelClasses = ['axm-session-lock-overlay-shell'];
2388
3018
  if (this.platform.isDark()) {
2389
3019
  panelClasses.push('ax-dark');
@@ -2582,6 +3212,26 @@ const CoreProfileSectionsHookProvider = {
2582
3212
  priority: 0,
2583
3213
  execute: (payload) => {
2584
3214
  const contributed = [
3215
+ {
3216
+ id: 'welcome-onboarding',
3217
+ groupId: 'account',
3218
+ title: '@auth:welcome-onboarding.profile.resume-section.title',
3219
+ description: '@auth:welcome-onboarding.profile.resume-section.description',
3220
+ icon: 'far fa-hand-wave',
3221
+ priority: 5,
3222
+ layout: { colSpan: 6 },
3223
+ actions: [
3224
+ {
3225
+ name: 'resume-welcome',
3226
+ title: '@auth:welcome-onboarding.profile.resume-action',
3227
+ icon: 'far fa-play',
3228
+ command: {
3229
+ name: AXMAuthCommandKeys.Onboarding.Welcome,
3230
+ options: { force: true },
3231
+ },
3232
+ },
3233
+ ],
3234
+ },
2585
3235
  {
2586
3236
  id: 'basic-info',
2587
3237
  groupId: 'account',
@@ -2672,7 +3322,7 @@ const CoreProfileSectionsHookProvider = {
2672
3322
  name: 'manage-two-factor',
2673
3323
  title: '@auth:profile-page.sections.two-factor.actions.manage',
2674
3324
  icon: 'far fa-pen',
2675
- command: comingSoon('@auth:profile-page.commands.manage-two-factor.coming-soon'),
3325
+ command: { name: AXMAuthCommandKeys.Security.ManageTwoFactor }, // auth:manage-two-factor
2676
3326
  },
2677
3327
  ],
2678
3328
  },
@@ -2843,10 +3493,30 @@ function buildPasswordLastChangedInsights(lastChangedAt) {
2843
3493
  }
2844
3494
  //#endregion
2845
3495
 
3496
+ //#region ----- Constants -----
3497
+ const TWO_FACTOR_SECTION_ID$1 = 'two-factor';
3498
+ //#endregion
3499
+ //#region ----- Two-factor insight -----
3500
+ /** Builds the enabled/disabled insight shown on the Two-Factor profile card. */
3501
+ function buildTwoFactorStatusInsights(enabled) {
3502
+ return [
3503
+ {
3504
+ id: 'two-factor-status',
3505
+ icon: enabled ? 'fa-light fa-fw fa-shield-check' : 'fa-light fa-fw fa-shield',
3506
+ text: enabled
3507
+ ? '@auth:profile-page.sections.two-factor.insights.enabled'
3508
+ : '@auth:profile-page.sections.two-factor.insights.disabled',
3509
+ },
3510
+ ];
3511
+ }
3512
+ //#endregion
3513
+
2846
3514
  //#region ---- Section ids ----
3515
+ const BASIC_INFO_SECTION_ID = 'basic-info';
2847
3516
  const SECURITY_PIN_SECTION_ID = 'security-pin';
2848
3517
  const ACTIVE_SESSIONS_SECTION_ID = 'active-sessions';
2849
3518
  const LOGIN_HISTORY_SECTION_ID = 'login-history';
3519
+ const TWO_FACTOR_SECTION_ID = 'two-factor';
2850
3520
  //#endregion
2851
3521
  //#region ---- Profile page security insights service ----
2852
3522
  /** Loads contextual security insights for profile section cards. */
@@ -2855,19 +3525,34 @@ class AXPUserProfileSecurityInsightsService {
2855
3525
  //#region ---- Services & Dependencies ----
2856
3526
  this.sessionService = inject(AXPSessionService);
2857
3527
  this.entityService = inject(AXPEntityService);
3528
+ this.commandService = inject(AXPCommandService);
2858
3529
  this.translateService = inject(AXTranslationService);
2859
3530
  this.passwordChangeTrackingService = inject(AXPAuthPasswordChangeTrackingService);
2860
3531
  }
2861
3532
  //#endregion
2862
3533
  //#region ---- Public API ----
3534
+ /** Account-tab insights (email on Basic Information). */
3535
+ async loadAccountBySectionId() {
3536
+ const userId = this.sessionService.user?.id;
3537
+ if (!userId) {
3538
+ return {};
3539
+ }
3540
+ const user = await this.loadCurrentUser(userId);
3541
+ const basicInfoInsights = this.buildBasicInfoInsights(user);
3542
+ if (isEmpty(basicInfoInsights)) {
3543
+ return {};
3544
+ }
3545
+ return { [BASIC_INFO_SECTION_ID]: basicInfoInsights };
3546
+ }
2863
3547
  async loadBySectionId() {
2864
3548
  const userId = this.sessionService.user?.id;
2865
3549
  if (!userId) {
2866
3550
  return {};
2867
3551
  }
2868
- const [sessions, user] = await Promise.all([
3552
+ const [sessions, user, twoFactorStatus] = await Promise.all([
2869
3553
  this.loadUserSessions(userId),
2870
3554
  this.loadCurrentUser(userId),
3555
+ this.loadTwoFactorStatus(),
2871
3556
  ]);
2872
3557
  const insightsBySectionId = {};
2873
3558
  const passwordInsights = this.buildPasswordInsights(userId, user);
@@ -2878,6 +3563,7 @@ class AXPUserProfileSecurityInsightsService {
2878
3563
  if (!isEmpty(pinInsights)) {
2879
3564
  insightsBySectionId[SECURITY_PIN_SECTION_ID] = pinInsights;
2880
3565
  }
3566
+ insightsBySectionId[TWO_FACTOR_SECTION_ID] = buildTwoFactorStatusInsights(twoFactorStatus?.enabled === true || twoFactorStatus?.enrolled === true);
2881
3567
  const activeSessionInsights = await this.buildActiveSessionInsights(sessions);
2882
3568
  if (!isEmpty(activeSessionInsights)) {
2883
3569
  insightsBySectionId[ACTIVE_SESSIONS_SECTION_ID] = activeSessionInsights;
@@ -2890,6 +3576,19 @@ class AXPUserProfileSecurityInsightsService {
2890
3576
  }
2891
3577
  //#endregion
2892
3578
  //#region ---- Insight builders ----
3579
+ buildBasicInfoInsights(user) {
3580
+ const email = defaultTo(user?.email, '').trim();
3581
+ return [
3582
+ {
3583
+ id: 'email',
3584
+ icon: 'fa-light fa-fw fa-envelope',
3585
+ title: '@general:terms.communication.email',
3586
+ text: isEmpty(email)
3587
+ ? '@auth:profile-page.sections.basic-info.insights.email-not-set'
3588
+ : email,
3589
+ },
3590
+ ];
3591
+ }
2893
3592
  buildPasswordInsights(userId, user) {
2894
3593
  const lastChangedAt = this.parseValidDate(user?.passwordChangedAt) ??
2895
3594
  this.passwordChangeTrackingService.getLastChangedAt(userId);
@@ -3009,6 +3708,19 @@ class AXPUserProfileSecurityInsightsService {
3009
3708
  });
3010
3709
  return response.items ?? [];
3011
3710
  }
3711
+ async loadTwoFactorStatus() {
3712
+ try {
3713
+ const result = await this.commandService.execute(AXMSecurityManagementServerCommands.GetTwoFactorStatus, {});
3714
+ if (!result?.success) {
3715
+ return null;
3716
+ }
3717
+ return runtimeCommandPayloadData(result) ?? null;
3718
+ }
3719
+ catch (error) {
3720
+ console.error('Failed to load two-factor status for profile security insights', error);
3721
+ return null;
3722
+ }
3723
+ }
3012
3724
  //#endregion
3013
3725
  //#region ---- Formatting ----
3014
3726
  parseValidDate(value) {
@@ -3042,16 +3754,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
3042
3754
  }] });
3043
3755
 
3044
3756
  //#region ---- Security sections insights hook ----
3045
- /** Adds live security context (sessions, login, password, PIN) to profile section cards. */
3757
+ /** Adds account + security context (email, sessions, login, password, PIN) to profile section cards. */
3046
3758
  const SecuritySectionsInsightsHookProvider = {
3047
3759
  key: PROFILE_PAGE_SECTIONS_HOOK,
3048
3760
  priority: 15,
3049
3761
  execute: async (payload) => {
3050
- if (!isUserProfileSectionsGroupRequested(payload, 'security')) {
3762
+ const wantAccount = isUserProfileSectionsGroupRequested(payload, 'account');
3763
+ const wantSecurity = isUserProfileSectionsGroupRequested(payload, 'security');
3764
+ if (!wantAccount && !wantSecurity) {
3051
3765
  return payload;
3052
3766
  }
3053
3767
  const insightsService = inject(AXPUserProfileSecurityInsightsService);
3054
- const insightsBySectionId = await insightsService.loadBySectionId();
3768
+ const insightsBySectionId = {
3769
+ ...(wantAccount ? await insightsService.loadAccountBySectionId() : {}),
3770
+ ...(wantSecurity ? await insightsService.loadBySectionId() : {}),
3771
+ };
3055
3772
  return {
3056
3773
  ...payload,
3057
3774
  sections: payload.sections.map((section) => {
@@ -3187,6 +3904,213 @@ const ProfileSlotPresenceMenuHookProvider = {
3187
3904
  };
3188
3905
  //#endregion
3189
3906
 
3907
+ //#region ---- Profile slot install app menu hook ----
3908
+ /** Registers Install App in the profile dropdown while this device is not in standalone mode. */
3909
+ const ProfileSlotInstallAppMenuHookProvider = {
3910
+ key: PROFILE_SLOT_MENU_ITEMS_HOOK,
3911
+ priority: 5,
3912
+ execute: (payload) => {
3913
+ const pwaInstall = inject(AXPPwaInstallService);
3914
+ return {
3915
+ ...payload,
3916
+ items: [
3917
+ ...payload.items,
3918
+ {
3919
+ name: 'install-app',
3920
+ title: '@auth:pwa-install.link',
3921
+ icon: 'fa-light fa-download',
3922
+ visible: pwaInstall.offerInProfile(),
3923
+ command: {
3924
+ name: 'navigate',
3925
+ options: {
3926
+ path: '/auth/install',
3927
+ },
3928
+ },
3929
+ },
3930
+ ],
3931
+ };
3932
+ },
3933
+ };
3934
+ //#endregion
3935
+
3936
+ //#region ----- Welcome preference steps hook -----
3937
+ /**
3938
+ * Core welcome preference steps, ordered for first-run UX:
3939
+ * language first (so later steps are readable), then appearance.
3940
+ * Editors use the same setting definitions as Settings → User.
3941
+ */
3942
+ const WelcomeIntroOnboardingHookProvider = {
3943
+ key: ONBOARDING_STEPS_HOOK,
3944
+ priority: 0,
3945
+ execute: (payload) => ({
3946
+ ...payload,
3947
+ steps: [
3948
+ ...payload.steps,
3949
+ {
3950
+ id: 'welcome-intro',
3951
+ scope: 'user',
3952
+ title: '@auth:welcome-onboarding.steps.welcome-intro.title',
3953
+ description: '@auth:welcome-onboarding.steps.welcome-intro.description',
3954
+ icon: 'fa-solid fa-earth-americas',
3955
+ priority: 10,
3956
+ settingKeys: [AXPRegionalSetting.Language, AXPRegionalSetting.TimeZone],
3957
+ },
3958
+ {
3959
+ id: 'welcome-appearance',
3960
+ scope: 'user',
3961
+ title: '@auth:welcome-onboarding.steps.welcome-appearance.title',
3962
+ description: '@auth:welcome-onboarding.steps.welcome-appearance.description',
3963
+ icon: 'far fa-palette',
3964
+ priority: 15,
3965
+ settingKeys: [
3966
+ AXPThemeLayoutSetting.Mode,
3967
+ AXPThemeLayoutSetting.Palette,
3968
+ AXPThemeLayoutSetting.MenuOrientation,
3969
+ AXPThemeLayoutSetting.MenuVerticalMode,
3970
+ AXPThemeLayoutSetting.HeaderAppearance,
3971
+ ],
3972
+ },
3973
+ ],
3974
+ }),
3975
+ };
3976
+ //#endregion
3977
+
3978
+ //#region ----- Profile basics step hook -----
3979
+ const welcomeSubFlowReturn = { subFlowReturnUrl: WELCOME_ONBOARDING_ROUTE };
3980
+ /**
3981
+ * User-scoped profile basics step (priority 20).
3982
+ * Self-service display name + photo only — no position/org assignment.
3983
+ */
3984
+ const ProfileBasicsOnboardingHookProvider = {
3985
+ key: ONBOARDING_STEPS_HOOK,
3986
+ priority: 0,
3987
+ execute: (payload) => ({
3988
+ ...payload,
3989
+ steps: [
3990
+ ...payload.steps,
3991
+ {
3992
+ id: 'profile-basics',
3993
+ scope: 'user',
3994
+ title: '@auth:welcome-onboarding.steps.profile-basics.title',
3995
+ description: '@auth:welcome-onboarding.steps.profile-basics.description',
3996
+ icon: 'far fa-user',
3997
+ priority: 20,
3998
+ actions: [
3999
+ {
4000
+ text: '@auth:welcome-onboarding.steps.profile-basics.edit-account',
4001
+ icon: 'fa-regular fa-pen',
4002
+ command: { name: AXMAuthCommandKeys.Profile.EditAccountInfo, options: welcomeSubFlowReturn },
4003
+ },
4004
+ {
4005
+ text: '@auth:welcome-onboarding.steps.profile-basics.change-photo',
4006
+ icon: 'fa-regular fa-camera',
4007
+ command: { name: AXMAuthCommandKeys.Profile.ChangePhoto, options: welcomeSubFlowReturn },
4008
+ },
4009
+ ],
4010
+ },
4011
+ ],
4012
+ }),
4013
+ };
4014
+ //#endregion
4015
+
4016
+ //#region ----- Navigation & typography welcome steps -----
4017
+ /** User preference steps: typography (with appearance), then navigation. */
4018
+ const WelcomeNavigationTypographyOnboardingHookProvider = {
4019
+ key: ONBOARDING_STEPS_HOOK,
4020
+ priority: 5,
4021
+ execute: (payload) => ({
4022
+ ...payload,
4023
+ steps: [
4024
+ ...payload.steps,
4025
+ {
4026
+ id: 'welcome-typography',
4027
+ scope: 'user',
4028
+ title: '@auth:welcome-onboarding.steps.welcome-typography.title',
4029
+ description: '@auth:welcome-onboarding.steps.welcome-typography.description',
4030
+ icon: 'fa-solid fa-font',
4031
+ priority: 16,
4032
+ settingKeys: [AXPThemeLayoutSetting.Font, AXPThemeLayoutSetting.FontSize],
4033
+ },
4034
+ {
4035
+ id: 'welcome-navigation',
4036
+ scope: 'user',
4037
+ title: '@auth:welcome-onboarding.steps.welcome-navigation.title',
4038
+ description: '@auth:welcome-onboarding.steps.welcome-navigation.description',
4039
+ icon: 'fa-solid fa-table-columns',
4040
+ priority: 17,
4041
+ settingKeys: [AXPCommonSettings.NavigationMode, AXPCommonSettings.MaxOpenTabs],
4042
+ },
4043
+ ],
4044
+ }),
4045
+ };
4046
+ //#endregion
4047
+
4048
+ //#region ----- Welcome onboarding trigger -----
4049
+ const WELCOME_TRIGGER_DELAY_MS = 600;
4050
+ /** Opens the welcome wizard after terms when the assembled plan is incomplete and not snoozed. */
4051
+ class AXPWelcomeOnboardingTriggerService {
4052
+ //#endregion
4053
+ //#region ----- Lifecycle -----
4054
+ constructor() {
4055
+ //#region ----- Services & Dependencies -----
4056
+ this.sessionService = inject(AXPSessionService);
4057
+ this.appInitService = inject(AXPAppStartUpService);
4058
+ this.flowService = inject(AXPWelcomeOnboardingFlowService);
4059
+ this.router = inject(Router);
4060
+ this.destroyRef = inject(DestroyRef);
4061
+ //#endregion
4062
+ //#region ----- State -----
4063
+ this.triggerGeneration = 0;
4064
+ this.appInitService.registerTask({
4065
+ name: 'welcome-onboarding',
4066
+ // Silent — no splash status text
4067
+ priority: AXP_APP_STARTUP_PRIORITY.terms + 1,
4068
+ run: async () => {
4069
+ // Evaluated reactively once the session is authorized with an application.
4070
+ },
4071
+ });
4072
+ combineLatest([this.sessionService.isAuthorized$, this.sessionService.application$])
4073
+ .pipe(distinctUntilChanged(([authorized, app], [previousAuthorized, previousApp]) => authorized === previousAuthorized && app?.id === previousApp?.id), switchMap(([authorized, app]) => {
4074
+ if (!authorized || !app || !this.sessionService.hasSessionCredentials()) {
4075
+ this.triggerGeneration++;
4076
+ return EMPTY;
4077
+ }
4078
+ const generation = this.triggerGeneration;
4079
+ return from(this.evaluateWelcomePlan(generation));
4080
+ }), takeUntilDestroyed(this.destroyRef))
4081
+ .subscribe();
4082
+ }
4083
+ //#endregion
4084
+ //#region ----- Evaluation -----
4085
+ async evaluateWelcomePlan(generation) {
4086
+ if (!this.canTrigger() || generation !== this.triggerGeneration) {
4087
+ return;
4088
+ }
4089
+ const pending = await this.flowService.evaluatePending(false);
4090
+ if (generation !== this.triggerGeneration || !this.canTrigger() || !pending) {
4091
+ return;
4092
+ }
4093
+ setTimeout(() => {
4094
+ if (generation !== this.triggerGeneration || !this.canTrigger()) {
4095
+ return;
4096
+ }
4097
+ const url = this.router.url;
4098
+ if (url.includes('/auth/account/welcome-onboarding')) {
4099
+ return;
4100
+ }
4101
+ void this.router.navigate(['/auth/account/welcome-onboarding']);
4102
+ }, WELCOME_TRIGGER_DELAY_MS);
4103
+ }
4104
+ canTrigger() {
4105
+ return this.sessionService.isReadyForAppScopedApi;
4106
+ }
4107
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPWelcomeOnboardingTriggerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
4108
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPWelcomeOnboardingTriggerService }); }
4109
+ }
4110
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPWelcomeOnboardingTriggerService, decorators: [{
4111
+ type: Injectable
4112
+ }], ctorParameters: () => [] });
4113
+
3190
4114
  //#region ---- User avatar client middleware ----
3191
4115
  const USER_ENTITY = `${RootConfig.module.name}.${RootConfig.entities.users.name}`;
3192
4116
  /** Refreshes avatar cache/session after user detail saves avatar. */
@@ -3219,26 +4143,48 @@ const TITLE_KEYS = {
3219
4143
  login_failed: '@auth:security-alert.login-failed.title',
3220
4144
  account_locked: '@auth:security-alert.account-locked.title',
3221
4145
  logout: '@auth:security-alert.logout.title',
4146
+ two_factor_enabled: '@auth:security-alert.two-factor-enabled.title',
4147
+ two_factor_disabled: '@auth:security-alert.two-factor-disabled.title',
4148
+ two_factor_admin_reset: '@auth:security-alert.two-factor-admin-reset.title',
4149
+ two_factor_recovery_codes_regenerated: '@auth:security-alert.two-factor-recovery-codes-regenerated.title',
3222
4150
  };
3223
4151
  const CONTENT_KEYS = {
3224
4152
  login_success: '@auth:security-alert.login-success.content',
3225
4153
  login_failed: '@auth:security-alert.login-failed.content',
3226
4154
  account_locked: '@auth:security-alert.account-locked.content',
3227
4155
  logout: '@auth:security-alert.logout.content',
4156
+ two_factor_enabled: '@auth:security-alert.two-factor-enabled.content',
4157
+ two_factor_disabled: '@auth:security-alert.two-factor-disabled.content',
4158
+ two_factor_admin_reset: '@auth:security-alert.two-factor-admin-reset.content',
4159
+ two_factor_recovery_codes_regenerated: '@auth:security-alert.two-factor-recovery-codes-regenerated.content',
3228
4160
  };
3229
4161
  const CONTENT_WITH_DETAIL_KEYS = {
3230
4162
  login_success: '@auth:security-alert.login-success.content-with-detail',
3231
4163
  login_failed: '@auth:security-alert.login-failed.content-with-detail',
3232
4164
  account_locked: '@auth:security-alert.account-locked.content-with-detail',
3233
4165
  logout: '@auth:security-alert.logout.content-with-detail',
4166
+ two_factor_enabled: '@auth:security-alert.two-factor-enabled.content-with-detail',
4167
+ two_factor_disabled: '@auth:security-alert.two-factor-disabled.content-with-detail',
4168
+ two_factor_admin_reset: '@auth:security-alert.two-factor-admin-reset.content-with-detail',
4169
+ two_factor_recovery_codes_regenerated: '@auth:security-alert.two-factor-recovery-codes-regenerated.content-with-detail',
3234
4170
  };
3235
- /** Prevents stacking multiple terminate dialogs on duplicate envelopes. */
4171
+ /** True while handling remote terminate (suppresses duplicate dialog + logout toast). */
3236
4172
  let remoteTerminateDialogOpen = false;
3237
- async function showAuthSecurityAlertToast(envelope, toast, translate) {
4173
+ async function showAuthSecurityAlertToast(envelope, toast, translate, sessionService) {
3238
4174
  const payload = (envelope.payload ?? {});
3239
4175
  if (!payload.kind || payload.kind === 'session_terminated' || !TITLE_KEYS[payload.kind]) {
3240
4176
  return;
3241
4177
  }
4178
+ // "Signed Out Elsewhere" is for other devices only — never toast on the signing-out browser.
4179
+ if (payload.kind === 'logout' && sessionService) {
4180
+ const [stillAuthenticated, loading] = await Promise.all([
4181
+ firstValueFrom(sessionService.isAuthenticated$),
4182
+ firstValueFrom(sessionService.isLoading$),
4183
+ ]);
4184
+ if (!stillAuthenticated || loading) {
4185
+ return;
4186
+ }
4187
+ }
3242
4188
  const detail = [payload.deviceSummary, payload.ipAddress]
3243
4189
  .map((part) => (part ?? '').trim())
3244
4190
  .filter(Boolean)
@@ -3251,20 +4197,30 @@ async function showAuthSecurityAlertToast(envelope, toast, translate) {
3251
4197
  params: { detail },
3252
4198
  })
3253
4199
  : CONTENT_KEYS[payload.kind];
3254
- const color = payload.kind === 'login_success' || payload.kind === 'logout' ? 'warning' : 'danger';
4200
+ const color = payload.kind === 'login_success' ||
4201
+ payload.kind === 'logout' ||
4202
+ payload.kind === 'two_factor_enabled' ||
4203
+ payload.kind === 'two_factor_disabled' ||
4204
+ payload.kind === 'two_factor_recovery_codes_regenerated'
4205
+ ? 'warning'
4206
+ : 'danger';
3255
4207
  toast.show({ color, title, content, closeButton: true, timeOut: 8000 });
3256
4208
  }
3257
4209
  async function handleRemoteSessionTerminated(sessionService, dialog, router) {
3258
- const [stillAuthenticated, loading] = await Promise.all([
3259
- firstValueFrom(sessionService.isAuthenticated$),
3260
- firstValueFrom(sessionService.isLoading$),
3261
- ]);
3262
- // Skip while local sign-out / session bind is in flight (avoids dialog on self-logout).
3263
- if (!stillAuthenticated || loading || remoteTerminateDialogOpen) {
4210
+ if (remoteTerminateDialogOpen) {
3264
4211
  return;
3265
4212
  }
4213
+ // Set before any await so a concurrent logout envelope skips its toast.
3266
4214
  remoteTerminateDialogOpen = true;
3267
4215
  try {
4216
+ const [stillAuthenticated, loading] = await Promise.all([
4217
+ firstValueFrom(sessionService.isAuthenticated$),
4218
+ firstValueFrom(sessionService.isLoading$),
4219
+ ]);
4220
+ // Skip while local sign-out / session bind is in flight (avoids dialog on self-logout).
4221
+ if (!stillAuthenticated || loading) {
4222
+ return;
4223
+ }
3268
4224
  // Backdrop click is disabled by AXDialogService.open — only Okay closes.
3269
4225
  await dialog.alert('@auth:security-alert.session-terminated.title', '@auth:security-alert.session-terminated.content', 'danger', 'horizontal');
3270
4226
  const authenticatedAfterAck = await firstValueFrom(sessionService.isAuthenticated$);
@@ -3303,7 +4259,11 @@ function provideAuthSecurityAlertRealtime() {
3303
4259
  await handleRemoteSessionTerminated(sessionService, dialog, router);
3304
4260
  return;
3305
4261
  }
3306
- await showAuthSecurityAlertToast(envelope, toast, translate);
4262
+ // Logout often arrives with session_terminated on the same socket — dialog only.
4263
+ if (payload.kind === 'logout' && remoteTerminateDialogOpen) {
4264
+ return;
4265
+ }
4266
+ await showAuthSecurityAlertToast(envelope, toast, translate, sessionService);
3307
4267
  });
3308
4268
  },
3309
4269
  };
@@ -3314,7 +4274,7 @@ function provideAuthSecurityAlertRealtime() {
3314
4274
  //#endregion
3315
4275
 
3316
4276
  function profileRoutesFactory() {
3317
- const loadProfilePage = () => import('./acorex-platform-module-auth-client-profile-page.component-CGs24n0j.mjs').then((c) => c.AXMUserProfilePageComponent);
4277
+ const loadProfilePage = () => import('./acorex-platform-module-auth-client-profile-page.component-BhmMsO3g.mjs').then((c) => c.AXMUserProfilePageComponent);
3318
4278
  return [
3319
4279
  {
3320
4280
  path: ':app/profile',
@@ -3340,12 +4300,23 @@ class AXMAuthModule {
3340
4300
  constructor() {
3341
4301
  inject(AXPIdleLockService);
3342
4302
  inject(AXPLogoEntitySyncService);
4303
+ inject(AXPWelcomeOnboardingTriggerService);
3343
4304
  }
3344
4305
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMAuthModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
3345
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.0.8", ngImport: i0, type: AXMAuthModule, imports: [CommonModule, i1$4.AXPCommonModule, i1$5.RouterModule, AXPAccountModule,
4306
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.0.8", ngImport: i0, type: AXMAuthModule, imports: [CommonModule, i1$4.AXPCommonModule, i6$1.RouterModule, AXPAccountModule,
3346
4307
  AXMAuthValidationRulesModule] }); }
3347
4308
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMAuthModule, providers: [
3348
4309
  ...provideAuthSecurityAlertRealtime(),
4310
+ provideAppStartUpTask(() => {
4311
+ const pwaInstall = inject(AXPPwaInstallService);
4312
+ return {
4313
+ name: 'pwa-install-prompt',
4314
+ priority: AXP_APP_STARTUP_PRIORITY.terms,
4315
+ run: async () => {
4316
+ pwaInstall.start();
4317
+ },
4318
+ };
4319
+ }),
3349
4320
  provideAppStartUpTask(() => {
3350
4321
  const sessionService = inject(AXPSessionService);
3351
4322
  const idleLockService = inject(AXPIdleLockService);
@@ -3430,12 +4401,12 @@ class AXMAuthModule {
3430
4401
  }),
3431
4402
  AXMAuthErrorHandler,
3432
4403
  provideLazyProvider(AXP_MENU_PROVIDER, () => import('./acorex-platform-module-auth-client-menu.provider-Bz-kRip4.mjs').then(m => m.AXMSecurityManagementModuleMenuProvider)),
3433
- provideLazyProvider(AXP_SETTING_DEFINITION_PROVIDER, () => import('./acorex-platform-module-auth-client-settings.provider-DGiK-MmW.mjs').then(m => m.AXMSettingProvider)),
3434
- provideLazyProvider(AXP_PAGE_COMPONENT_PROVIDER, () => import('./acorex-platform-module-auth-client-profile-page-component.provider-1Spuexhb.mjs').then((module) => module.AXMProfilePageComponentProvider)),
4404
+ provideLazyProvider(AXP_SETTING_DEFINITION_PROVIDER, () => import('./acorex-platform-module-auth-client-settings.provider-DsKsZrOC.mjs').then(m => m.AXMSettingProvider)),
4405
+ provideLazyProvider(AXP_PAGE_COMPONENT_PROVIDER, () => import('./acorex-platform-module-auth-client-profile-page-component.provider-DLTbTEe6.mjs').then((module) => module.AXMProfilePageComponentProvider)),
3435
4406
  provideQuerySetups([
3436
4407
  {
3437
4408
  key: 'Auth:GetUserActivity',
3438
- loader: () => import('./acorex-platform-module-auth-client-get-user-activity.query-B1bKcSVQ.mjs').then((c) => c.AXMGetUserActivityQuery),
4409
+ loader: () => import('./acorex-platform-module-auth-client-get-user-activity.query-CV9mdOBi.mjs').then((c) => c.AXMGetUserActivityQuery),
3439
4410
  },
3440
4411
  ]),
3441
4412
  {
@@ -3455,39 +4426,43 @@ class AXMAuthModule {
3455
4426
  },
3456
4427
  {
3457
4428
  key: AXMAuthCommandKeys.Session.Signout,
3458
- command: () => import('./acorex-platform-module-auth-client-signout-command-B7n_Fn4P.mjs').then((c) => c.AXPSignoutCommand),
4429
+ command: () => import('./acorex-platform-module-auth-client-signout-command-D4Qgv7q2.mjs').then((c) => c.AXPSignoutCommand),
3459
4430
  },
3460
4431
  {
3461
4432
  key: AXMAuthCommandKeys.Session.OpenSessions,
3462
- command: () => import('./acorex-platform-module-auth-client-open-sessions.command-DKvyMkhl.mjs').then((c) => c.AXPOpenSessionsCommand),
4433
+ command: () => import('./acorex-platform-module-auth-client-open-sessions.command-CEpu6c7D.mjs').then((c) => c.AXPOpenSessionsCommand),
3463
4434
  },
3464
4435
  {
3465
4436
  key: AXMAuthCommandKeys.Session.LockScreen,
3466
- command: () => import('./acorex-platform-module-auth-client-lock-screen.command-DKtlBzS7.mjs').then((c) => c.AXPLockScreenCommand),
4437
+ command: () => import('./acorex-platform-module-auth-client-lock-screen.command-BH3Q6lJE.mjs').then((c) => c.AXPLockScreenCommand),
3467
4438
  },
3468
4439
  {
3469
4440
  key: AXMAuthCommandKeys.Profile.ChangePhoto,
3470
- command: () => import('./acorex-platform-module-auth-client-change-photo.command-CzO3A7OG.mjs').then((c) => c.AXPChangePhotoCommand),
4441
+ command: () => import('./acorex-platform-module-auth-client-change-photo.command-CML784Lg.mjs').then((c) => c.AXPChangePhotoCommand),
3471
4442
  },
3472
4443
  {
3473
4444
  key: AXMAuthCommandKeys.Profile.EditAccountInfo,
3474
- command: () => import('./acorex-platform-module-auth-client-edit-account-info.command-CD9IrimO.mjs').then((c) => c.AXPEditAccountInfoCommand),
4445
+ command: () => import('./acorex-platform-module-auth-client-edit-account-info.command-DulLUfWs.mjs').then((c) => c.AXPEditAccountInfoCommand),
3475
4446
  },
3476
4447
  {
3477
4448
  key: AXMAuthCommandKeys.Security.ChangePassword,
3478
- command: () => import('./acorex-platform-module-auth-client-change-password.command-BqU3jYV9.mjs').then((c) => c.AXPChangePasswordCommand),
4449
+ command: () => import('./acorex-platform-module-auth-client-change-password.command-CknYaMZD.mjs').then((c) => c.AXPChangePasswordCommand),
4450
+ },
4451
+ {
4452
+ key: AXMAuthCommandKeys.Security.ManageTwoFactor,
4453
+ command: () => import('./acorex-platform-module-auth-client-manage-two-factor.command-BAg2W20W.mjs').then((c) => c.AXPManageTwoFactorCommand),
3479
4454
  },
3480
4455
  {
3481
4456
  key: AXMAuthCommandKeys.Security.SetPinCode,
3482
- command: () => import('./acorex-platform-module-auth-client-set-pin-code.command-FjM1kzUj.mjs').then((c) => c.AXPSetPinCodeCommand),
4457
+ command: () => import('./acorex-platform-module-auth-client-set-pin-code.command-CefSbJz8.mjs').then((c) => c.AXPSetPinCodeCommand),
3483
4458
  },
3484
4459
  {
3485
4460
  key: AXMAuthCommandKeys.Security.RemovePinCode,
3486
- command: () => import('./acorex-platform-module-auth-client-remove-pin-code.command-Da7ryul6.mjs').then((c) => c.AXPRemovePinCodeCommand),
4461
+ command: () => import('./acorex-platform-module-auth-client-remove-pin-code.command-BenNCyt6.mjs').then((c) => c.AXPRemovePinCodeCommand),
3487
4462
  },
3488
4463
  {
3489
4464
  key: AXMAuthCommandKeys.Security.ViewLoginHistory,
3490
- command: () => import('./acorex-platform-module-auth-client-view-login-history.command-Cqb27L-l.mjs').then((c) => c.AXPViewLoginHistoryCommand),
4465
+ command: () => import('./acorex-platform-module-auth-client-view-login-history.command-CKPbyVWd.mjs').then((c) => c.AXPViewLoginHistoryCommand),
3491
4466
  },
3492
4467
  {
3493
4468
  key: AXMAuthCommandKeys.Security.EditSignature,
@@ -3497,47 +4472,76 @@ class AXMAuthModule {
3497
4472
  key: AXMAuthCommandKeys.Profile.ComingSoon,
3498
4473
  command: () => import('./acorex-platform-module-auth-client-profile-coming-soon.command-Crh2GsRA.mjs').then((c) => c.AXPProfileComingSoonCommand),
3499
4474
  },
4475
+ {
4476
+ key: AXMAuthCommandKeys.Onboarding.Welcome,
4477
+ command: () => import('./acorex-platform-module-auth-client-welcome-onboarding.command-Ck1A26BI.mjs').then((c) => c.AXPWelcomeOnboardingCommand),
4478
+ },
4479
+ {
4480
+ key: AXMAuthCommandKeys.Account.OpenWaitingRoom,
4481
+ command: () => import('./acorex-platform-module-auth-client-open-waiting-room.command-CR-_ppYd.mjs').then((c) => c.AXPOpenWaitingRoomCommand),
4482
+ },
3500
4483
  ]),
4484
+ AXPWelcomeOnboardingTriggerService,
3501
4485
  {
3502
- provide: AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER,
4486
+ provide: AXP_HOOK_PROVIDER,
3503
4487
  useValue: ProfileSlotLogoutMenuHookProvider,
3504
4488
  multi: true,
3505
4489
  },
3506
4490
  {
3507
- provide: AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER,
4491
+ provide: AXP_HOOK_PROVIDER,
3508
4492
  useValue: ProfileSlotMyProfileMenuHookProvider,
3509
4493
  multi: true,
3510
4494
  },
3511
4495
  {
3512
- provide: AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER,
4496
+ provide: AXP_HOOK_PROVIDER,
4497
+ useValue: ProfileSlotInstallAppMenuHookProvider,
4498
+ multi: true,
4499
+ },
4500
+ {
4501
+ provide: AXP_HOOK_PROVIDER,
3513
4502
  useValue: ProfileSlotLockMenuHookProvider,
3514
4503
  multi: true,
3515
4504
  },
3516
4505
  {
3517
- provide: AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER,
4506
+ provide: AXP_HOOK_PROVIDER,
3518
4507
  useValue: ProfileSlotPresenceMenuHookProvider,
3519
4508
  multi: true,
3520
4509
  },
3521
4510
  {
3522
- provide: AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER,
4511
+ provide: AXP_HOOK_PROVIDER,
3523
4512
  useValue: CoreProfileGroupsHookProvider,
3524
4513
  multi: true,
3525
4514
  },
3526
4515
  {
3527
- provide: AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER,
4516
+ provide: AXP_HOOK_PROVIDER,
3528
4517
  useValue: CoreProfileSectionsHookProvider,
3529
4518
  multi: true,
3530
4519
  },
3531
4520
  {
3532
- provide: AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER,
4521
+ provide: AXP_HOOK_PROVIDER,
3533
4522
  useValue: SecurityPinSectionHookProvider,
3534
4523
  multi: true,
3535
4524
  },
3536
4525
  {
3537
- provide: AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER,
4526
+ provide: AXP_HOOK_PROVIDER,
3538
4527
  useValue: SecuritySectionsInsightsHookProvider,
3539
4528
  multi: true,
3540
4529
  },
4530
+ {
4531
+ provide: AXP_HOOK_PROVIDER,
4532
+ useValue: WelcomeIntroOnboardingHookProvider,
4533
+ multi: true,
4534
+ },
4535
+ {
4536
+ provide: AXP_HOOK_PROVIDER,
4537
+ useValue: ProfileBasicsOnboardingHookProvider,
4538
+ multi: true,
4539
+ },
4540
+ {
4541
+ provide: AXP_HOOK_PROVIDER,
4542
+ useValue: WelcomeNavigationTypographyOnboardingHookProvider,
4543
+ multi: true,
4544
+ },
3541
4545
  ], imports: [CommonModule,
3542
4546
  AXPCommonModule.forChild({ errorHandlers: [AXMAuthErrorHandler] }),
3543
4547
  RouterModule.forChild(routes),
@@ -3556,6 +4560,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
3556
4560
  ],
3557
4561
  providers: [
3558
4562
  ...provideAuthSecurityAlertRealtime(),
4563
+ provideAppStartUpTask(() => {
4564
+ const pwaInstall = inject(AXPPwaInstallService);
4565
+ return {
4566
+ name: 'pwa-install-prompt',
4567
+ priority: AXP_APP_STARTUP_PRIORITY.terms,
4568
+ run: async () => {
4569
+ pwaInstall.start();
4570
+ },
4571
+ };
4572
+ }),
3559
4573
  provideAppStartUpTask(() => {
3560
4574
  const sessionService = inject(AXPSessionService);
3561
4575
  const idleLockService = inject(AXPIdleLockService);
@@ -3640,12 +4654,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
3640
4654
  }),
3641
4655
  AXMAuthErrorHandler,
3642
4656
  provideLazyProvider(AXP_MENU_PROVIDER, () => import('./acorex-platform-module-auth-client-menu.provider-Bz-kRip4.mjs').then(m => m.AXMSecurityManagementModuleMenuProvider)),
3643
- provideLazyProvider(AXP_SETTING_DEFINITION_PROVIDER, () => import('./acorex-platform-module-auth-client-settings.provider-DGiK-MmW.mjs').then(m => m.AXMSettingProvider)),
3644
- provideLazyProvider(AXP_PAGE_COMPONENT_PROVIDER, () => import('./acorex-platform-module-auth-client-profile-page-component.provider-1Spuexhb.mjs').then((module) => module.AXMProfilePageComponentProvider)),
4657
+ provideLazyProvider(AXP_SETTING_DEFINITION_PROVIDER, () => import('./acorex-platform-module-auth-client-settings.provider-DsKsZrOC.mjs').then(m => m.AXMSettingProvider)),
4658
+ provideLazyProvider(AXP_PAGE_COMPONENT_PROVIDER, () => import('./acorex-platform-module-auth-client-profile-page-component.provider-DLTbTEe6.mjs').then((module) => module.AXMProfilePageComponentProvider)),
3645
4659
  provideQuerySetups([
3646
4660
  {
3647
4661
  key: 'Auth:GetUserActivity',
3648
- loader: () => import('./acorex-platform-module-auth-client-get-user-activity.query-B1bKcSVQ.mjs').then((c) => c.AXMGetUserActivityQuery),
4662
+ loader: () => import('./acorex-platform-module-auth-client-get-user-activity.query-CV9mdOBi.mjs').then((c) => c.AXMGetUserActivityQuery),
3649
4663
  },
3650
4664
  ]),
3651
4665
  {
@@ -3665,39 +4679,43 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
3665
4679
  },
3666
4680
  {
3667
4681
  key: AXMAuthCommandKeys.Session.Signout,
3668
- command: () => import('./acorex-platform-module-auth-client-signout-command-B7n_Fn4P.mjs').then((c) => c.AXPSignoutCommand),
4682
+ command: () => import('./acorex-platform-module-auth-client-signout-command-D4Qgv7q2.mjs').then((c) => c.AXPSignoutCommand),
3669
4683
  },
3670
4684
  {
3671
4685
  key: AXMAuthCommandKeys.Session.OpenSessions,
3672
- command: () => import('./acorex-platform-module-auth-client-open-sessions.command-DKvyMkhl.mjs').then((c) => c.AXPOpenSessionsCommand),
4686
+ command: () => import('./acorex-platform-module-auth-client-open-sessions.command-CEpu6c7D.mjs').then((c) => c.AXPOpenSessionsCommand),
3673
4687
  },
3674
4688
  {
3675
4689
  key: AXMAuthCommandKeys.Session.LockScreen,
3676
- command: () => import('./acorex-platform-module-auth-client-lock-screen.command-DKtlBzS7.mjs').then((c) => c.AXPLockScreenCommand),
4690
+ command: () => import('./acorex-platform-module-auth-client-lock-screen.command-BH3Q6lJE.mjs').then((c) => c.AXPLockScreenCommand),
3677
4691
  },
3678
4692
  {
3679
4693
  key: AXMAuthCommandKeys.Profile.ChangePhoto,
3680
- command: () => import('./acorex-platform-module-auth-client-change-photo.command-CzO3A7OG.mjs').then((c) => c.AXPChangePhotoCommand),
4694
+ command: () => import('./acorex-platform-module-auth-client-change-photo.command-CML784Lg.mjs').then((c) => c.AXPChangePhotoCommand),
3681
4695
  },
3682
4696
  {
3683
4697
  key: AXMAuthCommandKeys.Profile.EditAccountInfo,
3684
- command: () => import('./acorex-platform-module-auth-client-edit-account-info.command-CD9IrimO.mjs').then((c) => c.AXPEditAccountInfoCommand),
4698
+ command: () => import('./acorex-platform-module-auth-client-edit-account-info.command-DulLUfWs.mjs').then((c) => c.AXPEditAccountInfoCommand),
3685
4699
  },
3686
4700
  {
3687
4701
  key: AXMAuthCommandKeys.Security.ChangePassword,
3688
- command: () => import('./acorex-platform-module-auth-client-change-password.command-BqU3jYV9.mjs').then((c) => c.AXPChangePasswordCommand),
4702
+ command: () => import('./acorex-platform-module-auth-client-change-password.command-CknYaMZD.mjs').then((c) => c.AXPChangePasswordCommand),
4703
+ },
4704
+ {
4705
+ key: AXMAuthCommandKeys.Security.ManageTwoFactor,
4706
+ command: () => import('./acorex-platform-module-auth-client-manage-two-factor.command-BAg2W20W.mjs').then((c) => c.AXPManageTwoFactorCommand),
3689
4707
  },
3690
4708
  {
3691
4709
  key: AXMAuthCommandKeys.Security.SetPinCode,
3692
- command: () => import('./acorex-platform-module-auth-client-set-pin-code.command-FjM1kzUj.mjs').then((c) => c.AXPSetPinCodeCommand),
4710
+ command: () => import('./acorex-platform-module-auth-client-set-pin-code.command-CefSbJz8.mjs').then((c) => c.AXPSetPinCodeCommand),
3693
4711
  },
3694
4712
  {
3695
4713
  key: AXMAuthCommandKeys.Security.RemovePinCode,
3696
- command: () => import('./acorex-platform-module-auth-client-remove-pin-code.command-Da7ryul6.mjs').then((c) => c.AXPRemovePinCodeCommand),
4714
+ command: () => import('./acorex-platform-module-auth-client-remove-pin-code.command-BenNCyt6.mjs').then((c) => c.AXPRemovePinCodeCommand),
3697
4715
  },
3698
4716
  {
3699
4717
  key: AXMAuthCommandKeys.Security.ViewLoginHistory,
3700
- command: () => import('./acorex-platform-module-auth-client-view-login-history.command-Cqb27L-l.mjs').then((c) => c.AXPViewLoginHistoryCommand),
4718
+ command: () => import('./acorex-platform-module-auth-client-view-login-history.command-CKPbyVWd.mjs').then((c) => c.AXPViewLoginHistoryCommand),
3701
4719
  },
3702
4720
  {
3703
4721
  key: AXMAuthCommandKeys.Security.EditSignature,
@@ -3707,47 +4725,76 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
3707
4725
  key: AXMAuthCommandKeys.Profile.ComingSoon,
3708
4726
  command: () => import('./acorex-platform-module-auth-client-profile-coming-soon.command-Crh2GsRA.mjs').then((c) => c.AXPProfileComingSoonCommand),
3709
4727
  },
4728
+ {
4729
+ key: AXMAuthCommandKeys.Onboarding.Welcome,
4730
+ command: () => import('./acorex-platform-module-auth-client-welcome-onboarding.command-Ck1A26BI.mjs').then((c) => c.AXPWelcomeOnboardingCommand),
4731
+ },
4732
+ {
4733
+ key: AXMAuthCommandKeys.Account.OpenWaitingRoom,
4734
+ command: () => import('./acorex-platform-module-auth-client-open-waiting-room.command-CR-_ppYd.mjs').then((c) => c.AXPOpenWaitingRoomCommand),
4735
+ },
3710
4736
  ]),
4737
+ AXPWelcomeOnboardingTriggerService,
3711
4738
  {
3712
- provide: AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER,
4739
+ provide: AXP_HOOK_PROVIDER,
3713
4740
  useValue: ProfileSlotLogoutMenuHookProvider,
3714
4741
  multi: true,
3715
4742
  },
3716
4743
  {
3717
- provide: AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER,
4744
+ provide: AXP_HOOK_PROVIDER,
3718
4745
  useValue: ProfileSlotMyProfileMenuHookProvider,
3719
4746
  multi: true,
3720
4747
  },
3721
4748
  {
3722
- provide: AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER,
4749
+ provide: AXP_HOOK_PROVIDER,
4750
+ useValue: ProfileSlotInstallAppMenuHookProvider,
4751
+ multi: true,
4752
+ },
4753
+ {
4754
+ provide: AXP_HOOK_PROVIDER,
3723
4755
  useValue: ProfileSlotLockMenuHookProvider,
3724
4756
  multi: true,
3725
4757
  },
3726
4758
  {
3727
- provide: AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER,
4759
+ provide: AXP_HOOK_PROVIDER,
3728
4760
  useValue: ProfileSlotPresenceMenuHookProvider,
3729
4761
  multi: true,
3730
4762
  },
3731
4763
  {
3732
- provide: AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER,
4764
+ provide: AXP_HOOK_PROVIDER,
3733
4765
  useValue: CoreProfileGroupsHookProvider,
3734
4766
  multi: true,
3735
4767
  },
3736
4768
  {
3737
- provide: AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER,
4769
+ provide: AXP_HOOK_PROVIDER,
3738
4770
  useValue: CoreProfileSectionsHookProvider,
3739
4771
  multi: true,
3740
4772
  },
3741
4773
  {
3742
- provide: AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER,
4774
+ provide: AXP_HOOK_PROVIDER,
3743
4775
  useValue: SecurityPinSectionHookProvider,
3744
4776
  multi: true,
3745
4777
  },
3746
4778
  {
3747
- provide: AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER,
4779
+ provide: AXP_HOOK_PROVIDER,
3748
4780
  useValue: SecuritySectionsInsightsHookProvider,
3749
4781
  multi: true,
3750
4782
  },
4783
+ {
4784
+ provide: AXP_HOOK_PROVIDER,
4785
+ useValue: WelcomeIntroOnboardingHookProvider,
4786
+ multi: true,
4787
+ },
4788
+ {
4789
+ provide: AXP_HOOK_PROVIDER,
4790
+ useValue: ProfileBasicsOnboardingHookProvider,
4791
+ multi: true,
4792
+ },
4793
+ {
4794
+ provide: AXP_HOOK_PROVIDER,
4795
+ useValue: WelcomeNavigationTypographyOnboardingHookProvider,
4796
+ multi: true,
4797
+ },
3751
4798
  ],
3752
4799
  }]
3753
4800
  }], ctorParameters: () => [] });
@@ -3820,5 +4867,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
3820
4867
  * Generated bundle index. Do not edit.
3821
4868
  */
3822
4869
 
3823
- export { resolveDayDateRange as $, AXMUserDeviceSessionsService as A, AXPLoginExternalProvidersComponent as B, CHANGE_PASSWORD_SECTION_ID as C, AXMAuthenticationTypes as D, AUTH_LOGIN_EXTERNAL_PROVIDERS_SLOT as E, AUTH_USER_ACTIVITY_CLUSTER_GAP_DAYS as F, AUTH_USER_ACTIVITY_DEFAULT_WEEKS as G, AUTH_USER_ACTIVITY_WEEK_PRESETS as H, AXMAuthErrorHandler as I, AXMAuthModule as J, AXMDefaultAuthConfigs as K, AXM_AUTH_CONFIG_TOKEN as L, aggregateDailySessionCounts as M, aggregateHourlySessionCounts as N, buildUserActivityHours as O, PROFILE_PAGE_GROUPS_HOOK as P, buildUserActivityWeeks as Q, canActivateLogin as R, computeUserActivityStats as S, configAuthModule as T, countToActivityLevel as U, extractUserActivityEndDate as V, extractUserActivityStartDate as W, extractUserActivityUserId as X, isUserProfileGroupComponent as Y, isUserProfileSectionsGroupRequested as Z, parseAuthCredentialType as _, PROFILE_PAGE_SECTIONS_HOOK as a, resolveUserActivityHeatmapLayout as a0, PROFILE_PAGE_HEADER_META_HOOK as b, resolveUserProfileSectionContent as c, PROFILE_SECTION_INSIGHTS_PATCH_METADATA_KEY as d, PROFILE_ACTIVITY_CHART_COMPONENT_KEY as e, PROFILE_DELETE_ACCOUNT_DANGER_ZONE_COMPONENT_KEY as f, resolveDefaultUserActivityDateRange as g, resolveSmartUserActivityDateRange as h, buildUserActivityDataSourceItem as i, AXPIdleLockService as j, AXPUserAvatarSyncService as k, AXPAuthPasswordComplexityService as l, AXPAuthPasswordChangeTrackingService as m, getPasswordComplexityHintKey as n, getPasswordComplexityValidationMessageKey as o, validatePasswordAgainstComplexity as p, buildPasswordLastChangedInsights as q, resolveDefaultUserProfileSectionAction as r, AXPLoginHistoryService as s, AXMAuthPlatformSettingsService as t, AXM_LOGIN_GUARD_TOKEN as u, visibleUserProfileSectionActions as v, AXPTenantChooserListComponent as w, AXPTenantChooserDropdownComponent as x, AXPAppChooserListComponent as y, formatCompactActivityCount as z };
3824
- //# sourceMappingURL=acorex-platform-module-auth-client-acorex-platform-module-auth-client-CRl74b8g.mjs.map
4870
+ export { countToActivityLevel as $, AXMUserDeviceSessionsService as A, AXPTenantChooserDropdownComponent as B, CHANGE_PASSWORD_SECTION_ID as C, AXPAppChooserListComponent as D, AXPOnboardingProgressService as E, formatCompactActivityCount as F, AXPLoginExternalProvidersComponent as G, AXMAuthenticationTypes as H, AUTH_LOGIN_EXTERNAL_PROVIDERS_SLOT as I, AUTH_USER_ACTIVITY_CLUSTER_GAP_DAYS as J, AUTH_USER_ACTIVITY_DEFAULT_WEEKS as K, AUTH_USER_ACTIVITY_WEEK_PRESETS as L, AXMAuthErrorHandler as M, AXMAuthModule as N, AXMDefaultAuthConfigs as O, PROFILE_PAGE_GROUPS_HOOK as P, AXM_AUTH_CONFIG_TOKEN as Q, ONBOARDING_STEPS_HOOK as R, ONBOARDING_WELCOME_SETTING_KEY as S, TWO_FACTOR_SECTION_ID$1 as T, aggregateDailySessionCounts as U, aggregateHourlySessionCounts as V, buildUserActivityHours as W, buildUserActivityWeeks as X, canActivateLogin as Y, computeUserActivityStats as Z, configAuthModule as _, PROFILE_PAGE_SECTIONS_HOOK as a, extractUserActivityEndDate as a0, extractUserActivityStartDate as a1, extractUserActivityUserId as a2, isUserProfileGroupComponent as a3, isUserProfileSectionsGroupRequested as a4, parseAuthCredentialType as a5, resolveDayDateRange as a6, resolveUserActivityHeatmapLayout as a7, PROFILE_PAGE_HEADER_META_HOOK as b, resolveUserProfileSectionContent as c, PROFILE_SECTION_INSIGHTS_PATCH_METADATA_KEY as d, PROFILE_ACTIVITY_CHART_COMPONENT_KEY as e, PROFILE_DELETE_ACCOUNT_DANGER_ZONE_COMPONENT_KEY as f, resolveDefaultUserActivityDateRange as g, resolveSmartUserActivityDateRange as h, buildUserActivityDataSourceItem as i, AXPIdleLockService as j, AXPUserAvatarSyncService as k, AXPAuthPasswordComplexityService as l, AXPAuthPasswordChangeTrackingService as m, getPasswordComplexityHintKey as n, getPasswordComplexityValidationMessageKey as o, validatePasswordAgainstComplexity as p, buildPasswordLastChangedInsights as q, resolveDefaultUserProfileSectionAction as r, buildTwoFactorStatusInsights as s, AXPLoginHistoryService as t, AXPWelcomeOnboardingFlowService as u, visibleUserProfileSectionActions as v, AXMAuthPlatformSettingsService as w, AXPPwaInstallService as x, AXM_LOGIN_GUARD_TOKEN as y, AXPTenantChooserListComponent as z };
4871
+ //# sourceMappingURL=acorex-platform-module-auth-client-acorex-platform-module-auth-client-C1oSPf12.mjs.map