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

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-DXunSlPC.mjs} +1150 -107
  4. package/fesm2022/acorex-platform-module-auth-client-acorex-platform-module-auth-client-DXunSlPC.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-CxYe1hmk.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-CxYe1hmk.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-ci4weP0r.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-ci4weP0r.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-CuieLa-Q.mjs} +71 -21
  12. package/fesm2022/acorex-platform-module-auth-client-change-photo.command-CuieLa-Q.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-B6se2sJt.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-B6se2sJt.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-BRGUe-5j.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-BRGUe-5j.mjs.map} +1 -1
  23. package/fesm2022/{acorex-platform-module-auth-client-login.module-CXl61yOu.mjs → acorex-platform-module-auth-client-login.module-DasQfX02.mjs} +3 -3
  24. package/fesm2022/{acorex-platform-module-auth-client-login.module-CXl61yOu.mjs.map → acorex-platform-module-auth-client-login.module-DasQfX02.mjs.map} +1 -1
  25. package/fesm2022/acorex-platform-module-auth-client-manage-two-factor.command-t4UEDms3.mjs +445 -0
  26. package/fesm2022/acorex-platform-module-auth-client-manage-two-factor.command-t4UEDms3.mjs.map +1 -0
  27. package/fesm2022/{acorex-platform-module-auth-client-master.layout-D7zUm7aL.mjs → acorex-platform-module-auth-client-master.layout-hYj9JwHA.mjs} +5 -5
  28. package/fesm2022/{acorex-platform-module-auth-client-master.layout-D7zUm7aL.mjs.map → acorex-platform-module-auth-client-master.layout-hYj9JwHA.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-C9ue1SMV.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-C9ue1SMV.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-CkUMxpZm.mjs} +39 -9
  38. package/fesm2022/acorex-platform-module-auth-client-password.component-CkUMxpZm.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-DTfyVXWu.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-DTfyVXWu.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-i1SGrccV.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-i1SGrccV.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-DNtpDf8J.mjs} +9 -7
  48. package/fesm2022/acorex-platform-module-auth-client-profile-page.component-DNtpDf8J.mjs.map +1 -0
  49. package/fesm2022/acorex-platform-module-auth-client-pwa-install.component-DnDHvNsF.mjs +84 -0
  50. package/fesm2022/acorex-platform-module-auth-client-pwa-install.component-DnDHvNsF.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-C_Vu3KS-.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-C_Vu3KS-.mjs.map} +1 -1
  53. package/fesm2022/{acorex-platform-module-auth-client-register.module-CpoYf5uG.mjs → acorex-platform-module-auth-client-register.module-KlxTQevf.mjs} +4 -4
  54. package/fesm2022/{acorex-platform-module-auth-client-register.module-CpoYf5uG.mjs.map → acorex-platform-module-auth-client-register.module-KlxTQevf.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-0kRQprWO.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-0kRQprWO.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-CJJmgXqu.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-CJJmgXqu.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-CzUeATL1.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-CzUeATL1.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-DFzKiM1U.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-DFzKiM1U.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-HqU75mfO.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-HqU75mfO.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-CfZo5Jl0.mjs +200 -0
  80. package/fesm2022/acorex-platform-module-auth-client-two-factor-code.component-CfZo5Jl0.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-DoghMqeQ.mjs} +10 -5
  82. package/fesm2022/acorex-platform-module-auth-client-two-factor.module-DoghMqeQ.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-B35cTU-Z.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-B35cTU-Z.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-5NtRLNn3.mjs +813 -0
  88. package/fesm2022/acorex-platform-module-auth-client-welcome-onboarding-page.component-5NtRLNn3.mjs.map +1 -0
  89. package/fesm2022/acorex-platform-module-auth-client-welcome-onboarding.command-Cms-SKKf.mjs +59 -0
  90. package/fesm2022/acorex-platform-module-auth-client-welcome-onboarding.command-Cms-SKKf.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-hYj9JwHA.mjs').then((c) => c.AXPAuthMasterLayoutComponent),
999
+ children: [
1000
+ {
1001
+ path: 'install',
1002
+ loadComponent: () => import('./acorex-platform-module-auth-client-pwa-install.component-DnDHvNsF.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-hYj9JwHA.mjs').then((c) => c.AXPAuthMasterLayoutComponent),
1009
+ loadChildren: () => import('./acorex-platform-module-auth-client-login.module-DasQfX02.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-hYj9JwHA.mjs').then((c) => c.AXPAuthMasterLayoutComponent),
1014
+ loadChildren: () => import('./acorex-platform-module-auth-client-two-factor.module-DoghMqeQ.mjs').then((c) => c.AXPTwoFactorModule),
1015
+ },
1016
+ {
1017
+ path: '',
1018
+ loadComponent: () => import('./acorex-platform-module-auth-client-master.layout-hYj9JwHA.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-hYj9JwHA.mjs').then((c) => c.AXPAuthMasterLayoutComponent),
1033
+ loadChildren: () => import('./acorex-platform-module-auth-client-register.module-KlxTQevf.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,438 @@ 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.HeaderAppearance,
2339
+ AXPCommonSettings.NavigationMode,
2340
+ AXPCommonSettings.MaxOpenTabs,
2341
+ AXPThemeLayoutSetting.Font,
2342
+ AXPThemeLayoutSetting.FontSize,
2343
+ ];
2344
+ //#endregion
2345
+ //#region ----- Welcome onboarding flow -----
2346
+ /** Loads plan/preferences and builds per-step layout nodes for the welcome page. */
2347
+ class AXPWelcomeOnboardingFlowService {
2348
+ constructor() {
2349
+ //#region ----- Services & Dependencies -----
2350
+ this.layoutBuilder = inject(AXPLayoutBuilderService);
2351
+ this.sessionService = inject(AXPSessionService);
2352
+ this.planService = inject(AXPOnboardingPlanService);
2353
+ this.progressService = inject(AXPOnboardingProgressService);
2354
+ this.settingsService = inject(AXPSettingsService);
2355
+ this.settingDefinitions = inject(AXPSettingDefinitionProviderService);
2356
+ //#endregion
2357
+ //#region ----- State -----
2358
+ this.preferenceSettings = [];
2359
+ this.resumeContextKey = null;
2360
+ this.resumeStepId = null;
2361
+ }
2362
+ //#endregion
2363
+ //#region ----- Session & plan -----
2364
+ resolveContext() {
2365
+ const userId = this.sessionService.user?.id;
2366
+ const tenantId = this.sessionService.tenant?.id;
2367
+ const applicationId = this.sessionService.application?.id;
2368
+ if (!userId || !tenantId || !applicationId) {
2369
+ return null;
2370
+ }
2371
+ return { userId, tenantId, applicationId };
2372
+ }
2373
+ async evaluatePending(force) {
2374
+ const context = this.resolveContext();
2375
+ if (!context) {
2376
+ return null;
2377
+ }
2378
+ const progress = await this.progressService.getProgress();
2379
+ if (!force && this.progressService.isSnoozed(progress)) {
2380
+ return null;
2381
+ }
2382
+ const steps = await this.planService.assembleFullPlan(context);
2383
+ if (steps.length === 0) {
2384
+ return null;
2385
+ }
2386
+ const hasIncomplete = steps.some((step) => !this.progressService.isStepComplete(step, progress, context));
2387
+ if (!force && !hasIncomplete) {
2388
+ return null;
2389
+ }
2390
+ return { context, steps };
2391
+ }
2392
+ /** Index of the first step that is not completed/skipped for this session. */
2393
+ resolveFirstIncompleteStepIndex(steps, context, progress) {
2394
+ const index = steps.findIndex((step) => !this.progressService.isStepComplete(step, progress, context));
2395
+ return index >= 0 ? index : 0;
2396
+ }
2397
+ //#endregion
2398
+ //#region ----- Preferences -----
2399
+ async loadPreferenceContext() {
2400
+ this.preferenceSettings = await this.settingDefinitions.collectSettingsByKeys(AXPPlatformScope.User, WELCOME_PREFERENCE_SETTING_KEYS);
2401
+ const inheritedDefaults = await this.settingsService.defaultValues(AXPPlatformScope.User);
2402
+ const context = { ...inheritedDefaults };
2403
+ for (const setting of this.preferenceSettings) {
2404
+ const value = await this.settingsService.get(setting.name);
2405
+ if (value !== undefined && value !== null) {
2406
+ context[setting.name] = value;
2407
+ }
2408
+ }
2409
+ return context;
2410
+ }
2411
+ async savePreferences(formContext) {
2412
+ if (!formContext || this.preferenceSettings.length === 0) {
2413
+ return;
2414
+ }
2415
+ const values = {};
2416
+ for (const setting of this.preferenceSettings) {
2417
+ if (Object.prototype.hasOwnProperty.call(formContext, setting.name)) {
2418
+ values[setting.name] = formContext[setting.name];
2419
+ }
2420
+ }
2421
+ if (Object.keys(values).length === 0) {
2422
+ return;
2423
+ }
2424
+ await this.settingsService.scope(AXPPlatformScope.User).set(values, { flush: true });
2425
+ }
2426
+ //#endregion
2427
+ //#region ----- Resume (sub-flows e.g. change photo) -----
2428
+ contextKey(context) {
2429
+ return `${context.userId}:${context.tenantId}:${context.applicationId}`;
2430
+ }
2431
+ setResumeState(context, stepId) {
2432
+ this.resumeContextKey = this.contextKey(context);
2433
+ this.resumeStepId = stepId;
2434
+ }
2435
+ resolveResumeStepIndex(context, steps) {
2436
+ if (this.resumeContextKey !== this.contextKey(context) || !this.resumeStepId) {
2437
+ return 0;
2438
+ }
2439
+ const index = steps.findIndex((step) => step.id === this.resumeStepId);
2440
+ return index >= 0 ? index : 0;
2441
+ }
2442
+ clearResumeState() {
2443
+ this.resumeContextKey = null;
2444
+ this.resumeStepId = null;
2445
+ }
2446
+ hasActiveResumeState() {
2447
+ return this.resumeContextKey != null && this.resumeStepId != null;
2448
+ }
2449
+ //#endregion
2450
+ //#region ----- Progress -----
2451
+ async markStep(step, context, status) {
2452
+ if (status === 'completed') {
2453
+ await this.progressService.markComplete(step, context);
2454
+ return;
2455
+ }
2456
+ await this.progressService.markSkipped(step, context);
2457
+ }
2458
+ async markSteps(steps, context, status) {
2459
+ let progress = await this.progressService.getProgress();
2460
+ for (const step of steps) {
2461
+ progress =
2462
+ status === 'completed'
2463
+ ? await this.progressService.markComplete(step, context, progress)
2464
+ : await this.progressService.markSkipped(step, context, progress);
2465
+ }
2466
+ }
2467
+ async persistAll(steps, context, status) {
2468
+ let progress = await this.progressService.getProgress();
2469
+ for (const step of steps) {
2470
+ progress =
2471
+ status === 'completed'
2472
+ ? await this.progressService.markComplete(step, context, progress)
2473
+ : await this.progressService.markSkipped(step, context, progress);
2474
+ }
2475
+ }
2476
+ async setRemindLater() {
2477
+ const until = new Date(Date.now() + REMIND_LATER_HOURS * 60 * 60 * 1000).toISOString();
2478
+ await this.progressService.setRemindLater(until);
2479
+ }
2480
+ //#endregion
2481
+ //#region ----- Step layout -----
2482
+ buildStepLayout(step) {
2483
+ const builder = this.layoutBuilder.create();
2484
+ builder.flex((flex) => {
2485
+ flex
2486
+ .setDirection('column')
2487
+ .setGap('12px')
2488
+ .setAlignItems('stretch')
2489
+ .setJustifyContent('flex-start');
2490
+ const settingKeys = step.settingKeys ?? [];
2491
+ if (settingKeys.length > 0) {
2492
+ this.appendPreferenceFields(flex, settingKeys);
2493
+ }
2494
+ const actions = step.actions ?? [];
2495
+ if (actions.length > 0) {
2496
+ flex.flex((row) => {
2497
+ row.setDirection('row').setGap('8px').setWrap('wrap');
2498
+ for (const action of actions) {
2499
+ row.customWidget('button-action', {
2500
+ text: action.text,
2501
+ icon: action.icon,
2502
+ look: { id: 'outline' },
2503
+ color: { id: 'primary' },
2504
+ command: action.command,
2505
+ });
2506
+ }
2507
+ });
2508
+ }
2509
+ });
2510
+ return builder.build();
2511
+ }
2512
+ appendPreferenceFields(flex, settingKeys) {
2513
+ const settings = this.preferenceSettings.filter((setting) => settingKeys.includes(setting.name));
2514
+ for (const setting of settings) {
2515
+ flex.formField(setting.title, (formField) => {
2516
+ formField.path(setting.name);
2517
+ if (setting.description) {
2518
+ formField.setOptions({
2519
+ hint: setting.description,
2520
+ hintDisplayMode: 'note',
2521
+ });
2522
+ }
2523
+ const widgetOptions = { ...(setting.widget.options ?? {}) };
2524
+ const visibilityExpr = widgetOptions['visibility'];
2525
+ if (typeof visibilityExpr === 'string') {
2526
+ formField.visible(visibilityExpr);
2527
+ delete widgetOptions['visibility'];
2528
+ }
2529
+ formField.customWidget(setting.widget.type, {
2530
+ ...widgetOptions,
2531
+ ...(setting.isRequired ? { validations: [{ rule: 'required' }] } : {}),
2532
+ });
2533
+ });
2534
+ }
2535
+ }
2536
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPWelcomeOnboardingFlowService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
2537
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPWelcomeOnboardingFlowService, providedIn: 'root' }); }
2538
+ }
2539
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPWelcomeOnboardingFlowService, decorators: [{
2540
+ type: Injectable,
2541
+ args: [{ providedIn: 'root' }]
2542
+ }] });
2543
+
2544
+ //#region ----- Welcome onboarding route guard -----
2545
+ const canActivateWelcomeOnboarding = async (route) => {
2546
+ const sessionService = inject(AXPSessionService);
2547
+ const router = inject(Router);
2548
+ const flowService = inject(AXPWelcomeOnboardingFlowService);
2549
+ const homePageService = inject(AXPHomePageService);
2550
+ if (!sessionService.hasSessionCredentials()) {
2551
+ return router.createUrlTree(['/auth/login']);
2552
+ }
2553
+ if (!sessionService.tenant?.id) {
2554
+ return router.createUrlTree(['/auth/account/tenant-chooser']);
2555
+ }
2556
+ if (!sessionService.application?.id) {
2557
+ return router.createUrlTree(['/auth/account/app-chooser']);
2558
+ }
2559
+ const force = route.queryParamMap.get('force') === '1' || route.queryParamMap.get('force') === 'true';
2560
+ const pending = await flowService.evaluatePending(force);
2561
+ if (!pending) {
2562
+ if (flowService.hasActiveResumeState()) {
2563
+ return true;
2564
+ }
2565
+ return await homePageService.resolveAuthorizedHomeUrlTree();
2566
+ }
2567
+ return true;
2568
+ };
2569
+ //#endregion
2570
+
1983
2571
  function routesFacory() {
1984
2572
  let routes = [];
1985
2573
  routes = [
1986
2574
  {
1987
2575
  path: 'tenant-chooser',
1988
- loadComponent: () => import('./acorex-platform-module-auth-client-tenant-chooser.component-B8CNqHx5.mjs').then((c) => c.AXPAuthTenantChooserComponent),
2576
+ loadComponent: () => import('./acorex-platform-module-auth-client-tenant-chooser.component-HqU75mfO.mjs').then((c) => c.AXPAuthTenantChooserComponent),
1989
2577
  canActivate: [AXPAuthGuard, canActivateTenantChooser],
1990
2578
  },
2579
+ {
2580
+ path: 'waiting-room',
2581
+ loadComponent: () => import('./acorex-platform-module-auth-client-waiting-room.component-IAVIt1fY.mjs').then((c) => c.AXPAuthWaitingRoomComponent),
2582
+ canActivate: [AXPAuthGuard],
2583
+ },
1991
2584
  {
1992
2585
  path: 'session-limit',
1993
- loadComponent: () => import('./acorex-platform-module-auth-client-session-limit.component-DH58dRba.mjs').then((c) => c.AXPAuthSessionLimitComponent),
2586
+ loadComponent: () => import('./acorex-platform-module-auth-client-session-limit.component-Dc6TIn-2.mjs').then((c) => c.AXPAuthSessionLimitComponent),
1994
2587
  canActivate: [AXPAuthGuard],
1995
2588
  },
1996
2589
  {
1997
2590
  path: 'app-chooser',
1998
- loadComponent: () => import('./acorex-platform-module-auth-client-app-chooser.component-CjWofUGR.mjs').then((c) => c.AXPAuthAppChooserComponent),
2591
+ loadComponent: () => import('./acorex-platform-module-auth-client-app-chooser.component-CxYe1hmk.mjs').then((c) => c.AXPAuthAppChooserComponent),
1999
2592
  canActivate: [AXPAuthGuard, canActivateAppChooser],
2000
2593
  },
2594
+ {
2595
+ path: 'welcome-onboarding',
2596
+ loadComponent: () => import('./acorex-platform-module-auth-client-welcome-onboarding-page.component-5NtRLNn3.mjs').then((c) => c.AXPAuthWelcomeOnboardingPageComponent),
2597
+ canActivate: [AXPAuthGuard, canActivateWelcomeOnboarding],
2598
+ },
2001
2599
  ];
2002
2600
  return routes;
2003
2601
  }
@@ -2022,6 +2620,20 @@ class AXPAccountModule {
2022
2620
  component: AXMUserProfileCardSlotComponent,
2023
2621
  },
2024
2622
  ],
2623
+ 'root-footer-end': [
2624
+ {
2625
+ priority: 20,
2626
+ name: 'pwa-install-prompt',
2627
+ component: AXMPwaInstallPromptComponent,
2628
+ },
2629
+ ],
2630
+ 'root-layout-overlay': [
2631
+ {
2632
+ priority: 10,
2633
+ name: 'pwa-install-prompt',
2634
+ component: AXMPwaInstallPromptComponent,
2635
+ },
2636
+ ],
2025
2637
  'root-header-end': [
2026
2638
  {
2027
2639
  priority: 98,
@@ -2049,6 +2661,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
2049
2661
  component: AXMUserProfileCardSlotComponent,
2050
2662
  },
2051
2663
  ],
2664
+ 'root-footer-end': [
2665
+ {
2666
+ priority: 20,
2667
+ name: 'pwa-install-prompt',
2668
+ component: AXMPwaInstallPromptComponent,
2669
+ },
2670
+ ],
2671
+ 'root-layout-overlay': [
2672
+ {
2673
+ priority: 10,
2674
+ name: 'pwa-install-prompt',
2675
+ component: AXMPwaInstallPromptComponent,
2676
+ },
2677
+ ],
2052
2678
  'root-header-end': [
2053
2679
  {
2054
2680
  priority: 98,
@@ -2383,7 +3009,7 @@ class AXPIdleLockService {
2383
3009
  this.overlayOpening = true;
2384
3010
  this.locked.set(true);
2385
3011
  try {
2386
- const { AXMSessionLockOverlayComponent: overlayComponent } = await import('./acorex-platform-module-auth-client-session-lock-overlay.component-cDCrwNRV.mjs');
3012
+ const { AXMSessionLockOverlayComponent: overlayComponent } = await import('./acorex-platform-module-auth-client-session-lock-overlay.component-CJJmgXqu.mjs');
2387
3013
  const panelClasses = ['axm-session-lock-overlay-shell'];
2388
3014
  if (this.platform.isDark()) {
2389
3015
  panelClasses.push('ax-dark');
@@ -2582,6 +3208,26 @@ const CoreProfileSectionsHookProvider = {
2582
3208
  priority: 0,
2583
3209
  execute: (payload) => {
2584
3210
  const contributed = [
3211
+ {
3212
+ id: 'welcome-onboarding',
3213
+ groupId: 'account',
3214
+ title: '@auth:welcome-onboarding.profile.resume-section.title',
3215
+ description: '@auth:welcome-onboarding.profile.resume-section.description',
3216
+ icon: 'far fa-hand-wave',
3217
+ priority: 5,
3218
+ layout: { colSpan: 6 },
3219
+ actions: [
3220
+ {
3221
+ name: 'resume-welcome',
3222
+ title: '@auth:welcome-onboarding.profile.resume-action',
3223
+ icon: 'far fa-play',
3224
+ command: {
3225
+ name: AXMAuthCommandKeys.Onboarding.Welcome,
3226
+ options: { force: true },
3227
+ },
3228
+ },
3229
+ ],
3230
+ },
2585
3231
  {
2586
3232
  id: 'basic-info',
2587
3233
  groupId: 'account',
@@ -2672,7 +3318,7 @@ const CoreProfileSectionsHookProvider = {
2672
3318
  name: 'manage-two-factor',
2673
3319
  title: '@auth:profile-page.sections.two-factor.actions.manage',
2674
3320
  icon: 'far fa-pen',
2675
- command: comingSoon('@auth:profile-page.commands.manage-two-factor.coming-soon'),
3321
+ command: { name: AXMAuthCommandKeys.Security.ManageTwoFactor }, // auth:manage-two-factor
2676
3322
  },
2677
3323
  ],
2678
3324
  },
@@ -2843,10 +3489,30 @@ function buildPasswordLastChangedInsights(lastChangedAt) {
2843
3489
  }
2844
3490
  //#endregion
2845
3491
 
3492
+ //#region ----- Constants -----
3493
+ const TWO_FACTOR_SECTION_ID$1 = 'two-factor';
3494
+ //#endregion
3495
+ //#region ----- Two-factor insight -----
3496
+ /** Builds the enabled/disabled insight shown on the Two-Factor profile card. */
3497
+ function buildTwoFactorStatusInsights(enabled) {
3498
+ return [
3499
+ {
3500
+ id: 'two-factor-status',
3501
+ icon: enabled ? 'fa-light fa-fw fa-shield-check' : 'fa-light fa-fw fa-shield',
3502
+ text: enabled
3503
+ ? '@auth:profile-page.sections.two-factor.insights.enabled'
3504
+ : '@auth:profile-page.sections.two-factor.insights.disabled',
3505
+ },
3506
+ ];
3507
+ }
3508
+ //#endregion
3509
+
2846
3510
  //#region ---- Section ids ----
3511
+ const BASIC_INFO_SECTION_ID = 'basic-info';
2847
3512
  const SECURITY_PIN_SECTION_ID = 'security-pin';
2848
3513
  const ACTIVE_SESSIONS_SECTION_ID = 'active-sessions';
2849
3514
  const LOGIN_HISTORY_SECTION_ID = 'login-history';
3515
+ const TWO_FACTOR_SECTION_ID = 'two-factor';
2850
3516
  //#endregion
2851
3517
  //#region ---- Profile page security insights service ----
2852
3518
  /** Loads contextual security insights for profile section cards. */
@@ -2855,19 +3521,34 @@ class AXPUserProfileSecurityInsightsService {
2855
3521
  //#region ---- Services & Dependencies ----
2856
3522
  this.sessionService = inject(AXPSessionService);
2857
3523
  this.entityService = inject(AXPEntityService);
3524
+ this.commandService = inject(AXPCommandService);
2858
3525
  this.translateService = inject(AXTranslationService);
2859
3526
  this.passwordChangeTrackingService = inject(AXPAuthPasswordChangeTrackingService);
2860
3527
  }
2861
3528
  //#endregion
2862
3529
  //#region ---- Public API ----
3530
+ /** Account-tab insights (email on Basic Information). */
3531
+ async loadAccountBySectionId() {
3532
+ const userId = this.sessionService.user?.id;
3533
+ if (!userId) {
3534
+ return {};
3535
+ }
3536
+ const user = await this.loadCurrentUser(userId);
3537
+ const basicInfoInsights = this.buildBasicInfoInsights(user);
3538
+ if (isEmpty(basicInfoInsights)) {
3539
+ return {};
3540
+ }
3541
+ return { [BASIC_INFO_SECTION_ID]: basicInfoInsights };
3542
+ }
2863
3543
  async loadBySectionId() {
2864
3544
  const userId = this.sessionService.user?.id;
2865
3545
  if (!userId) {
2866
3546
  return {};
2867
3547
  }
2868
- const [sessions, user] = await Promise.all([
3548
+ const [sessions, user, twoFactorStatus] = await Promise.all([
2869
3549
  this.loadUserSessions(userId),
2870
3550
  this.loadCurrentUser(userId),
3551
+ this.loadTwoFactorStatus(),
2871
3552
  ]);
2872
3553
  const insightsBySectionId = {};
2873
3554
  const passwordInsights = this.buildPasswordInsights(userId, user);
@@ -2878,6 +3559,7 @@ class AXPUserProfileSecurityInsightsService {
2878
3559
  if (!isEmpty(pinInsights)) {
2879
3560
  insightsBySectionId[SECURITY_PIN_SECTION_ID] = pinInsights;
2880
3561
  }
3562
+ insightsBySectionId[TWO_FACTOR_SECTION_ID] = buildTwoFactorStatusInsights(twoFactorStatus?.enabled === true || twoFactorStatus?.enrolled === true);
2881
3563
  const activeSessionInsights = await this.buildActiveSessionInsights(sessions);
2882
3564
  if (!isEmpty(activeSessionInsights)) {
2883
3565
  insightsBySectionId[ACTIVE_SESSIONS_SECTION_ID] = activeSessionInsights;
@@ -2890,6 +3572,19 @@ class AXPUserProfileSecurityInsightsService {
2890
3572
  }
2891
3573
  //#endregion
2892
3574
  //#region ---- Insight builders ----
3575
+ buildBasicInfoInsights(user) {
3576
+ const email = defaultTo(user?.email, '').trim();
3577
+ return [
3578
+ {
3579
+ id: 'email',
3580
+ icon: 'fa-light fa-fw fa-envelope',
3581
+ title: '@general:terms.communication.email',
3582
+ text: isEmpty(email)
3583
+ ? '@auth:profile-page.sections.basic-info.insights.email-not-set'
3584
+ : email,
3585
+ },
3586
+ ];
3587
+ }
2893
3588
  buildPasswordInsights(userId, user) {
2894
3589
  const lastChangedAt = this.parseValidDate(user?.passwordChangedAt) ??
2895
3590
  this.passwordChangeTrackingService.getLastChangedAt(userId);
@@ -3009,6 +3704,19 @@ class AXPUserProfileSecurityInsightsService {
3009
3704
  });
3010
3705
  return response.items ?? [];
3011
3706
  }
3707
+ async loadTwoFactorStatus() {
3708
+ try {
3709
+ const result = await this.commandService.execute(AXMSecurityManagementServerCommands.GetTwoFactorStatus, {});
3710
+ if (!result?.success) {
3711
+ return null;
3712
+ }
3713
+ return runtimeCommandPayloadData(result) ?? null;
3714
+ }
3715
+ catch (error) {
3716
+ console.error('Failed to load two-factor status for profile security insights', error);
3717
+ return null;
3718
+ }
3719
+ }
3012
3720
  //#endregion
3013
3721
  //#region ---- Formatting ----
3014
3722
  parseValidDate(value) {
@@ -3042,16 +3750,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
3042
3750
  }] });
3043
3751
 
3044
3752
  //#region ---- Security sections insights hook ----
3045
- /** Adds live security context (sessions, login, password, PIN) to profile section cards. */
3753
+ /** Adds account + security context (email, sessions, login, password, PIN) to profile section cards. */
3046
3754
  const SecuritySectionsInsightsHookProvider = {
3047
3755
  key: PROFILE_PAGE_SECTIONS_HOOK,
3048
3756
  priority: 15,
3049
3757
  execute: async (payload) => {
3050
- if (!isUserProfileSectionsGroupRequested(payload, 'security')) {
3758
+ const wantAccount = isUserProfileSectionsGroupRequested(payload, 'account');
3759
+ const wantSecurity = isUserProfileSectionsGroupRequested(payload, 'security');
3760
+ if (!wantAccount && !wantSecurity) {
3051
3761
  return payload;
3052
3762
  }
3053
3763
  const insightsService = inject(AXPUserProfileSecurityInsightsService);
3054
- const insightsBySectionId = await insightsService.loadBySectionId();
3764
+ const insightsBySectionId = {
3765
+ ...(wantAccount ? await insightsService.loadAccountBySectionId() : {}),
3766
+ ...(wantSecurity ? await insightsService.loadBySectionId() : {}),
3767
+ };
3055
3768
  return {
3056
3769
  ...payload,
3057
3770
  sections: payload.sections.map((section) => {
@@ -3187,6 +3900,213 @@ const ProfileSlotPresenceMenuHookProvider = {
3187
3900
  };
3188
3901
  //#endregion
3189
3902
 
3903
+ //#region ---- Profile slot install app menu hook ----
3904
+ /** Registers Install App in the profile dropdown while this device is not in standalone mode. */
3905
+ const ProfileSlotInstallAppMenuHookProvider = {
3906
+ key: PROFILE_SLOT_MENU_ITEMS_HOOK,
3907
+ priority: 5,
3908
+ execute: (payload) => {
3909
+ const pwaInstall = inject(AXPPwaInstallService);
3910
+ return {
3911
+ ...payload,
3912
+ items: [
3913
+ ...payload.items,
3914
+ {
3915
+ name: 'install-app',
3916
+ title: '@auth:pwa-install.link',
3917
+ icon: 'fa-light fa-download',
3918
+ visible: pwaInstall.offerInProfile(),
3919
+ command: {
3920
+ name: 'navigate',
3921
+ options: {
3922
+ path: '/auth/install',
3923
+ },
3924
+ },
3925
+ },
3926
+ ],
3927
+ };
3928
+ },
3929
+ };
3930
+ //#endregion
3931
+
3932
+ //#region ----- Welcome preference steps hook -----
3933
+ /**
3934
+ * Core welcome preference steps, ordered for first-run UX:
3935
+ * language first (so later steps are readable), then appearance.
3936
+ * Editors use the same setting definitions as Settings → User.
3937
+ */
3938
+ const WelcomeIntroOnboardingHookProvider = {
3939
+ key: ONBOARDING_STEPS_HOOK,
3940
+ priority: 0,
3941
+ execute: (payload) => ({
3942
+ ...payload,
3943
+ steps: [
3944
+ ...payload.steps,
3945
+ {
3946
+ id: 'welcome-intro',
3947
+ scope: 'user',
3948
+ title: '@auth:welcome-onboarding.steps.welcome-intro.title',
3949
+ description: '@auth:welcome-onboarding.steps.welcome-intro.description',
3950
+ icon: 'fa-solid fa-earth-americas',
3951
+ priority: 10,
3952
+ settingKeys: [AXPRegionalSetting.Language, AXPRegionalSetting.TimeZone],
3953
+ },
3954
+ {
3955
+ id: 'welcome-appearance',
3956
+ scope: 'user',
3957
+ title: '@auth:welcome-onboarding.steps.welcome-appearance.title',
3958
+ description: '@auth:welcome-onboarding.steps.welcome-appearance.description',
3959
+ icon: 'far fa-palette',
3960
+ priority: 15,
3961
+ settingKeys: [
3962
+ AXPThemeLayoutSetting.Mode,
3963
+ AXPThemeLayoutSetting.Palette,
3964
+ AXPThemeLayoutSetting.MenuOrientation,
3965
+ AXPThemeLayoutSetting.MenuVerticalMode,
3966
+ AXPThemeLayoutSetting.HeaderAppearance,
3967
+ ],
3968
+ },
3969
+ ],
3970
+ }),
3971
+ };
3972
+ //#endregion
3973
+
3974
+ //#region ----- Profile basics step hook -----
3975
+ const welcomeSubFlowReturn = { subFlowReturnUrl: WELCOME_ONBOARDING_ROUTE };
3976
+ /**
3977
+ * User-scoped profile basics step (priority 20).
3978
+ * Self-service display name + photo only — no position/org assignment.
3979
+ */
3980
+ const ProfileBasicsOnboardingHookProvider = {
3981
+ key: ONBOARDING_STEPS_HOOK,
3982
+ priority: 0,
3983
+ execute: (payload) => ({
3984
+ ...payload,
3985
+ steps: [
3986
+ ...payload.steps,
3987
+ {
3988
+ id: 'profile-basics',
3989
+ scope: 'user',
3990
+ title: '@auth:welcome-onboarding.steps.profile-basics.title',
3991
+ description: '@auth:welcome-onboarding.steps.profile-basics.description',
3992
+ icon: 'far fa-user',
3993
+ priority: 20,
3994
+ actions: [
3995
+ {
3996
+ text: '@auth:welcome-onboarding.steps.profile-basics.edit-account',
3997
+ icon: 'fa-regular fa-pen',
3998
+ command: { name: AXMAuthCommandKeys.Profile.EditAccountInfo, options: welcomeSubFlowReturn },
3999
+ },
4000
+ {
4001
+ text: '@auth:welcome-onboarding.steps.profile-basics.change-photo',
4002
+ icon: 'fa-regular fa-camera',
4003
+ command: { name: AXMAuthCommandKeys.Profile.ChangePhoto, options: welcomeSubFlowReturn },
4004
+ },
4005
+ ],
4006
+ },
4007
+ ],
4008
+ }),
4009
+ };
4010
+ //#endregion
4011
+
4012
+ //#region ----- Navigation & typography welcome steps -----
4013
+ /** User preference steps: typography (with appearance), then navigation. */
4014
+ const WelcomeNavigationTypographyOnboardingHookProvider = {
4015
+ key: ONBOARDING_STEPS_HOOK,
4016
+ priority: 5,
4017
+ execute: (payload) => ({
4018
+ ...payload,
4019
+ steps: [
4020
+ ...payload.steps,
4021
+ {
4022
+ id: 'welcome-typography',
4023
+ scope: 'user',
4024
+ title: '@auth:welcome-onboarding.steps.welcome-typography.title',
4025
+ description: '@auth:welcome-onboarding.steps.welcome-typography.description',
4026
+ icon: 'fa-solid fa-font',
4027
+ priority: 16,
4028
+ settingKeys: [AXPThemeLayoutSetting.Font, AXPThemeLayoutSetting.FontSize],
4029
+ },
4030
+ {
4031
+ id: 'welcome-navigation',
4032
+ scope: 'user',
4033
+ title: '@auth:welcome-onboarding.steps.welcome-navigation.title',
4034
+ description: '@auth:welcome-onboarding.steps.welcome-navigation.description',
4035
+ icon: 'fa-solid fa-table-columns',
4036
+ priority: 17,
4037
+ settingKeys: [AXPCommonSettings.NavigationMode, AXPCommonSettings.MaxOpenTabs],
4038
+ },
4039
+ ],
4040
+ }),
4041
+ };
4042
+ //#endregion
4043
+
4044
+ //#region ----- Welcome onboarding trigger -----
4045
+ const WELCOME_TRIGGER_DELAY_MS = 600;
4046
+ /** Opens the welcome wizard after terms when the assembled plan is incomplete and not snoozed. */
4047
+ class AXPWelcomeOnboardingTriggerService {
4048
+ //#endregion
4049
+ //#region ----- Lifecycle -----
4050
+ constructor() {
4051
+ //#region ----- Services & Dependencies -----
4052
+ this.sessionService = inject(AXPSessionService);
4053
+ this.appInitService = inject(AXPAppStartUpService);
4054
+ this.flowService = inject(AXPWelcomeOnboardingFlowService);
4055
+ this.router = inject(Router);
4056
+ this.destroyRef = inject(DestroyRef);
4057
+ //#endregion
4058
+ //#region ----- State -----
4059
+ this.triggerGeneration = 0;
4060
+ this.appInitService.registerTask({
4061
+ name: 'welcome-onboarding',
4062
+ // Silent — no splash status text
4063
+ priority: AXP_APP_STARTUP_PRIORITY.terms + 1,
4064
+ run: async () => {
4065
+ // Evaluated reactively once the session is authorized with an application.
4066
+ },
4067
+ });
4068
+ combineLatest([this.sessionService.isAuthorized$, this.sessionService.application$])
4069
+ .pipe(distinctUntilChanged(([authorized, app], [previousAuthorized, previousApp]) => authorized === previousAuthorized && app?.id === previousApp?.id), switchMap(([authorized, app]) => {
4070
+ if (!authorized || !app || !this.sessionService.hasSessionCredentials()) {
4071
+ this.triggerGeneration++;
4072
+ return EMPTY;
4073
+ }
4074
+ const generation = this.triggerGeneration;
4075
+ return from(this.evaluateWelcomePlan(generation));
4076
+ }), takeUntilDestroyed(this.destroyRef))
4077
+ .subscribe();
4078
+ }
4079
+ //#endregion
4080
+ //#region ----- Evaluation -----
4081
+ async evaluateWelcomePlan(generation) {
4082
+ if (!this.canTrigger() || generation !== this.triggerGeneration) {
4083
+ return;
4084
+ }
4085
+ const pending = await this.flowService.evaluatePending(false);
4086
+ if (generation !== this.triggerGeneration || !this.canTrigger() || !pending) {
4087
+ return;
4088
+ }
4089
+ setTimeout(() => {
4090
+ if (generation !== this.triggerGeneration || !this.canTrigger()) {
4091
+ return;
4092
+ }
4093
+ const url = this.router.url;
4094
+ if (url.includes('/auth/account/welcome-onboarding')) {
4095
+ return;
4096
+ }
4097
+ void this.router.navigate(['/auth/account/welcome-onboarding']);
4098
+ }, WELCOME_TRIGGER_DELAY_MS);
4099
+ }
4100
+ canTrigger() {
4101
+ return this.sessionService.isReadyForAppScopedApi;
4102
+ }
4103
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPWelcomeOnboardingTriggerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
4104
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPWelcomeOnboardingTriggerService }); }
4105
+ }
4106
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPWelcomeOnboardingTriggerService, decorators: [{
4107
+ type: Injectable
4108
+ }], ctorParameters: () => [] });
4109
+
3190
4110
  //#region ---- User avatar client middleware ----
3191
4111
  const USER_ENTITY = `${RootConfig.module.name}.${RootConfig.entities.users.name}`;
3192
4112
  /** Refreshes avatar cache/session after user detail saves avatar. */
@@ -3219,26 +4139,48 @@ const TITLE_KEYS = {
3219
4139
  login_failed: '@auth:security-alert.login-failed.title',
3220
4140
  account_locked: '@auth:security-alert.account-locked.title',
3221
4141
  logout: '@auth:security-alert.logout.title',
4142
+ two_factor_enabled: '@auth:security-alert.two-factor-enabled.title',
4143
+ two_factor_disabled: '@auth:security-alert.two-factor-disabled.title',
4144
+ two_factor_admin_reset: '@auth:security-alert.two-factor-admin-reset.title',
4145
+ two_factor_recovery_codes_regenerated: '@auth:security-alert.two-factor-recovery-codes-regenerated.title',
3222
4146
  };
3223
4147
  const CONTENT_KEYS = {
3224
4148
  login_success: '@auth:security-alert.login-success.content',
3225
4149
  login_failed: '@auth:security-alert.login-failed.content',
3226
4150
  account_locked: '@auth:security-alert.account-locked.content',
3227
4151
  logout: '@auth:security-alert.logout.content',
4152
+ two_factor_enabled: '@auth:security-alert.two-factor-enabled.content',
4153
+ two_factor_disabled: '@auth:security-alert.two-factor-disabled.content',
4154
+ two_factor_admin_reset: '@auth:security-alert.two-factor-admin-reset.content',
4155
+ two_factor_recovery_codes_regenerated: '@auth:security-alert.two-factor-recovery-codes-regenerated.content',
3228
4156
  };
3229
4157
  const CONTENT_WITH_DETAIL_KEYS = {
3230
4158
  login_success: '@auth:security-alert.login-success.content-with-detail',
3231
4159
  login_failed: '@auth:security-alert.login-failed.content-with-detail',
3232
4160
  account_locked: '@auth:security-alert.account-locked.content-with-detail',
3233
4161
  logout: '@auth:security-alert.logout.content-with-detail',
4162
+ two_factor_enabled: '@auth:security-alert.two-factor-enabled.content-with-detail',
4163
+ two_factor_disabled: '@auth:security-alert.two-factor-disabled.content-with-detail',
4164
+ two_factor_admin_reset: '@auth:security-alert.two-factor-admin-reset.content-with-detail',
4165
+ two_factor_recovery_codes_regenerated: '@auth:security-alert.two-factor-recovery-codes-regenerated.content-with-detail',
3234
4166
  };
3235
- /** Prevents stacking multiple terminate dialogs on duplicate envelopes. */
4167
+ /** True while handling remote terminate (suppresses duplicate dialog + logout toast). */
3236
4168
  let remoteTerminateDialogOpen = false;
3237
- async function showAuthSecurityAlertToast(envelope, toast, translate) {
4169
+ async function showAuthSecurityAlertToast(envelope, toast, translate, sessionService) {
3238
4170
  const payload = (envelope.payload ?? {});
3239
4171
  if (!payload.kind || payload.kind === 'session_terminated' || !TITLE_KEYS[payload.kind]) {
3240
4172
  return;
3241
4173
  }
4174
+ // "Signed Out Elsewhere" is for other devices only — never toast on the signing-out browser.
4175
+ if (payload.kind === 'logout' && sessionService) {
4176
+ const [stillAuthenticated, loading] = await Promise.all([
4177
+ firstValueFrom(sessionService.isAuthenticated$),
4178
+ firstValueFrom(sessionService.isLoading$),
4179
+ ]);
4180
+ if (!stillAuthenticated || loading) {
4181
+ return;
4182
+ }
4183
+ }
3242
4184
  const detail = [payload.deviceSummary, payload.ipAddress]
3243
4185
  .map((part) => (part ?? '').trim())
3244
4186
  .filter(Boolean)
@@ -3251,20 +4193,30 @@ async function showAuthSecurityAlertToast(envelope, toast, translate) {
3251
4193
  params: { detail },
3252
4194
  })
3253
4195
  : CONTENT_KEYS[payload.kind];
3254
- const color = payload.kind === 'login_success' || payload.kind === 'logout' ? 'warning' : 'danger';
4196
+ const color = payload.kind === 'login_success' ||
4197
+ payload.kind === 'logout' ||
4198
+ payload.kind === 'two_factor_enabled' ||
4199
+ payload.kind === 'two_factor_disabled' ||
4200
+ payload.kind === 'two_factor_recovery_codes_regenerated'
4201
+ ? 'warning'
4202
+ : 'danger';
3255
4203
  toast.show({ color, title, content, closeButton: true, timeOut: 8000 });
3256
4204
  }
3257
4205
  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) {
4206
+ if (remoteTerminateDialogOpen) {
3264
4207
  return;
3265
4208
  }
4209
+ // Set before any await so a concurrent logout envelope skips its toast.
3266
4210
  remoteTerminateDialogOpen = true;
3267
4211
  try {
4212
+ const [stillAuthenticated, loading] = await Promise.all([
4213
+ firstValueFrom(sessionService.isAuthenticated$),
4214
+ firstValueFrom(sessionService.isLoading$),
4215
+ ]);
4216
+ // Skip while local sign-out / session bind is in flight (avoids dialog on self-logout).
4217
+ if (!stillAuthenticated || loading) {
4218
+ return;
4219
+ }
3268
4220
  // Backdrop click is disabled by AXDialogService.open — only Okay closes.
3269
4221
  await dialog.alert('@auth:security-alert.session-terminated.title', '@auth:security-alert.session-terminated.content', 'danger', 'horizontal');
3270
4222
  const authenticatedAfterAck = await firstValueFrom(sessionService.isAuthenticated$);
@@ -3303,7 +4255,11 @@ function provideAuthSecurityAlertRealtime() {
3303
4255
  await handleRemoteSessionTerminated(sessionService, dialog, router);
3304
4256
  return;
3305
4257
  }
3306
- await showAuthSecurityAlertToast(envelope, toast, translate);
4258
+ // Logout often arrives with session_terminated on the same socket — dialog only.
4259
+ if (payload.kind === 'logout' && remoteTerminateDialogOpen) {
4260
+ return;
4261
+ }
4262
+ await showAuthSecurityAlertToast(envelope, toast, translate, sessionService);
3307
4263
  });
3308
4264
  },
3309
4265
  };
@@ -3314,7 +4270,7 @@ function provideAuthSecurityAlertRealtime() {
3314
4270
  //#endregion
3315
4271
 
3316
4272
  function profileRoutesFactory() {
3317
- const loadProfilePage = () => import('./acorex-platform-module-auth-client-profile-page.component-CGs24n0j.mjs').then((c) => c.AXMUserProfilePageComponent);
4273
+ const loadProfilePage = () => import('./acorex-platform-module-auth-client-profile-page.component-DNtpDf8J.mjs').then((c) => c.AXMUserProfilePageComponent);
3318
4274
  return [
3319
4275
  {
3320
4276
  path: ':app/profile',
@@ -3340,12 +4296,23 @@ class AXMAuthModule {
3340
4296
  constructor() {
3341
4297
  inject(AXPIdleLockService);
3342
4298
  inject(AXPLogoEntitySyncService);
4299
+ inject(AXPWelcomeOnboardingTriggerService);
3343
4300
  }
3344
4301
  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,
4302
+ 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
4303
  AXMAuthValidationRulesModule] }); }
3347
4304
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMAuthModule, providers: [
3348
4305
  ...provideAuthSecurityAlertRealtime(),
4306
+ provideAppStartUpTask(() => {
4307
+ const pwaInstall = inject(AXPPwaInstallService);
4308
+ return {
4309
+ name: 'pwa-install-prompt',
4310
+ priority: AXP_APP_STARTUP_PRIORITY.terms,
4311
+ run: async () => {
4312
+ pwaInstall.start();
4313
+ },
4314
+ };
4315
+ }),
3349
4316
  provideAppStartUpTask(() => {
3350
4317
  const sessionService = inject(AXPSessionService);
3351
4318
  const idleLockService = inject(AXPIdleLockService);
@@ -3430,12 +4397,12 @@ class AXMAuthModule {
3430
4397
  }),
3431
4398
  AXMAuthErrorHandler,
3432
4399
  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)),
4400
+ provideLazyProvider(AXP_SETTING_DEFINITION_PROVIDER, () => import('./acorex-platform-module-auth-client-settings.provider-DsKsZrOC.mjs').then(m => m.AXMSettingProvider)),
4401
+ provideLazyProvider(AXP_PAGE_COMPONENT_PROVIDER, () => import('./acorex-platform-module-auth-client-profile-page-component.provider-i1SGrccV.mjs').then((module) => module.AXMProfilePageComponentProvider)),
3435
4402
  provideQuerySetups([
3436
4403
  {
3437
4404
  key: 'Auth:GetUserActivity',
3438
- loader: () => import('./acorex-platform-module-auth-client-get-user-activity.query-B1bKcSVQ.mjs').then((c) => c.AXMGetUserActivityQuery),
4405
+ loader: () => import('./acorex-platform-module-auth-client-get-user-activity.query-B6se2sJt.mjs').then((c) => c.AXMGetUserActivityQuery),
3439
4406
  },
3440
4407
  ]),
3441
4408
  {
@@ -3455,39 +4422,43 @@ class AXMAuthModule {
3455
4422
  },
3456
4423
  {
3457
4424
  key: AXMAuthCommandKeys.Session.Signout,
3458
- command: () => import('./acorex-platform-module-auth-client-signout-command-B7n_Fn4P.mjs').then((c) => c.AXPSignoutCommand),
4425
+ command: () => import('./acorex-platform-module-auth-client-signout-command-D4Qgv7q2.mjs').then((c) => c.AXPSignoutCommand),
3459
4426
  },
3460
4427
  {
3461
4428
  key: AXMAuthCommandKeys.Session.OpenSessions,
3462
- command: () => import('./acorex-platform-module-auth-client-open-sessions.command-DKvyMkhl.mjs').then((c) => c.AXPOpenSessionsCommand),
4429
+ command: () => import('./acorex-platform-module-auth-client-open-sessions.command-C9ue1SMV.mjs').then((c) => c.AXPOpenSessionsCommand),
3463
4430
  },
3464
4431
  {
3465
4432
  key: AXMAuthCommandKeys.Session.LockScreen,
3466
- command: () => import('./acorex-platform-module-auth-client-lock-screen.command-DKtlBzS7.mjs').then((c) => c.AXPLockScreenCommand),
4433
+ command: () => import('./acorex-platform-module-auth-client-lock-screen.command-BRGUe-5j.mjs').then((c) => c.AXPLockScreenCommand),
3467
4434
  },
3468
4435
  {
3469
4436
  key: AXMAuthCommandKeys.Profile.ChangePhoto,
3470
- command: () => import('./acorex-platform-module-auth-client-change-photo.command-CzO3A7OG.mjs').then((c) => c.AXPChangePhotoCommand),
4437
+ command: () => import('./acorex-platform-module-auth-client-change-photo.command-CuieLa-Q.mjs').then((c) => c.AXPChangePhotoCommand),
3471
4438
  },
3472
4439
  {
3473
4440
  key: AXMAuthCommandKeys.Profile.EditAccountInfo,
3474
- command: () => import('./acorex-platform-module-auth-client-edit-account-info.command-CD9IrimO.mjs').then((c) => c.AXPEditAccountInfoCommand),
4441
+ command: () => import('./acorex-platform-module-auth-client-edit-account-info.command-DulLUfWs.mjs').then((c) => c.AXPEditAccountInfoCommand),
3475
4442
  },
3476
4443
  {
3477
4444
  key: AXMAuthCommandKeys.Security.ChangePassword,
3478
- command: () => import('./acorex-platform-module-auth-client-change-password.command-BqU3jYV9.mjs').then((c) => c.AXPChangePasswordCommand),
4445
+ command: () => import('./acorex-platform-module-auth-client-change-password.command-ci4weP0r.mjs').then((c) => c.AXPChangePasswordCommand),
4446
+ },
4447
+ {
4448
+ key: AXMAuthCommandKeys.Security.ManageTwoFactor,
4449
+ command: () => import('./acorex-platform-module-auth-client-manage-two-factor.command-t4UEDms3.mjs').then((c) => c.AXPManageTwoFactorCommand),
3479
4450
  },
3480
4451
  {
3481
4452
  key: AXMAuthCommandKeys.Security.SetPinCode,
3482
- command: () => import('./acorex-platform-module-auth-client-set-pin-code.command-FjM1kzUj.mjs').then((c) => c.AXPSetPinCodeCommand),
4453
+ command: () => import('./acorex-platform-module-auth-client-set-pin-code.command-CzUeATL1.mjs').then((c) => c.AXPSetPinCodeCommand),
3483
4454
  },
3484
4455
  {
3485
4456
  key: AXMAuthCommandKeys.Security.RemovePinCode,
3486
- command: () => import('./acorex-platform-module-auth-client-remove-pin-code.command-Da7ryul6.mjs').then((c) => c.AXPRemovePinCodeCommand),
4457
+ command: () => import('./acorex-platform-module-auth-client-remove-pin-code.command-0kRQprWO.mjs').then((c) => c.AXPRemovePinCodeCommand),
3487
4458
  },
3488
4459
  {
3489
4460
  key: AXMAuthCommandKeys.Security.ViewLoginHistory,
3490
- command: () => import('./acorex-platform-module-auth-client-view-login-history.command-Cqb27L-l.mjs').then((c) => c.AXPViewLoginHistoryCommand),
4461
+ command: () => import('./acorex-platform-module-auth-client-view-login-history.command-B35cTU-Z.mjs').then((c) => c.AXPViewLoginHistoryCommand),
3491
4462
  },
3492
4463
  {
3493
4464
  key: AXMAuthCommandKeys.Security.EditSignature,
@@ -3497,47 +4468,76 @@ class AXMAuthModule {
3497
4468
  key: AXMAuthCommandKeys.Profile.ComingSoon,
3498
4469
  command: () => import('./acorex-platform-module-auth-client-profile-coming-soon.command-Crh2GsRA.mjs').then((c) => c.AXPProfileComingSoonCommand),
3499
4470
  },
4471
+ {
4472
+ key: AXMAuthCommandKeys.Onboarding.Welcome,
4473
+ command: () => import('./acorex-platform-module-auth-client-welcome-onboarding.command-Cms-SKKf.mjs').then((c) => c.AXPWelcomeOnboardingCommand),
4474
+ },
4475
+ {
4476
+ key: AXMAuthCommandKeys.Account.OpenWaitingRoom,
4477
+ command: () => import('./acorex-platform-module-auth-client-open-waiting-room.command-CR-_ppYd.mjs').then((c) => c.AXPOpenWaitingRoomCommand),
4478
+ },
3500
4479
  ]),
4480
+ AXPWelcomeOnboardingTriggerService,
3501
4481
  {
3502
- provide: AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER,
4482
+ provide: AXP_HOOK_PROVIDER,
3503
4483
  useValue: ProfileSlotLogoutMenuHookProvider,
3504
4484
  multi: true,
3505
4485
  },
3506
4486
  {
3507
- provide: AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER,
4487
+ provide: AXP_HOOK_PROVIDER,
3508
4488
  useValue: ProfileSlotMyProfileMenuHookProvider,
3509
4489
  multi: true,
3510
4490
  },
3511
4491
  {
3512
- provide: AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER,
4492
+ provide: AXP_HOOK_PROVIDER,
4493
+ useValue: ProfileSlotInstallAppMenuHookProvider,
4494
+ multi: true,
4495
+ },
4496
+ {
4497
+ provide: AXP_HOOK_PROVIDER,
3513
4498
  useValue: ProfileSlotLockMenuHookProvider,
3514
4499
  multi: true,
3515
4500
  },
3516
4501
  {
3517
- provide: AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER,
4502
+ provide: AXP_HOOK_PROVIDER,
3518
4503
  useValue: ProfileSlotPresenceMenuHookProvider,
3519
4504
  multi: true,
3520
4505
  },
3521
4506
  {
3522
- provide: AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER,
4507
+ provide: AXP_HOOK_PROVIDER,
3523
4508
  useValue: CoreProfileGroupsHookProvider,
3524
4509
  multi: true,
3525
4510
  },
3526
4511
  {
3527
- provide: AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER,
4512
+ provide: AXP_HOOK_PROVIDER,
3528
4513
  useValue: CoreProfileSectionsHookProvider,
3529
4514
  multi: true,
3530
4515
  },
3531
4516
  {
3532
- provide: AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER,
4517
+ provide: AXP_HOOK_PROVIDER,
3533
4518
  useValue: SecurityPinSectionHookProvider,
3534
4519
  multi: true,
3535
4520
  },
3536
4521
  {
3537
- provide: AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER,
4522
+ provide: AXP_HOOK_PROVIDER,
3538
4523
  useValue: SecuritySectionsInsightsHookProvider,
3539
4524
  multi: true,
3540
4525
  },
4526
+ {
4527
+ provide: AXP_HOOK_PROVIDER,
4528
+ useValue: WelcomeIntroOnboardingHookProvider,
4529
+ multi: true,
4530
+ },
4531
+ {
4532
+ provide: AXP_HOOK_PROVIDER,
4533
+ useValue: ProfileBasicsOnboardingHookProvider,
4534
+ multi: true,
4535
+ },
4536
+ {
4537
+ provide: AXP_HOOK_PROVIDER,
4538
+ useValue: WelcomeNavigationTypographyOnboardingHookProvider,
4539
+ multi: true,
4540
+ },
3541
4541
  ], imports: [CommonModule,
3542
4542
  AXPCommonModule.forChild({ errorHandlers: [AXMAuthErrorHandler] }),
3543
4543
  RouterModule.forChild(routes),
@@ -3556,6 +4556,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
3556
4556
  ],
3557
4557
  providers: [
3558
4558
  ...provideAuthSecurityAlertRealtime(),
4559
+ provideAppStartUpTask(() => {
4560
+ const pwaInstall = inject(AXPPwaInstallService);
4561
+ return {
4562
+ name: 'pwa-install-prompt',
4563
+ priority: AXP_APP_STARTUP_PRIORITY.terms,
4564
+ run: async () => {
4565
+ pwaInstall.start();
4566
+ },
4567
+ };
4568
+ }),
3559
4569
  provideAppStartUpTask(() => {
3560
4570
  const sessionService = inject(AXPSessionService);
3561
4571
  const idleLockService = inject(AXPIdleLockService);
@@ -3640,12 +4650,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
3640
4650
  }),
3641
4651
  AXMAuthErrorHandler,
3642
4652
  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)),
4653
+ provideLazyProvider(AXP_SETTING_DEFINITION_PROVIDER, () => import('./acorex-platform-module-auth-client-settings.provider-DsKsZrOC.mjs').then(m => m.AXMSettingProvider)),
4654
+ provideLazyProvider(AXP_PAGE_COMPONENT_PROVIDER, () => import('./acorex-platform-module-auth-client-profile-page-component.provider-i1SGrccV.mjs').then((module) => module.AXMProfilePageComponentProvider)),
3645
4655
  provideQuerySetups([
3646
4656
  {
3647
4657
  key: 'Auth:GetUserActivity',
3648
- loader: () => import('./acorex-platform-module-auth-client-get-user-activity.query-B1bKcSVQ.mjs').then((c) => c.AXMGetUserActivityQuery),
4658
+ loader: () => import('./acorex-platform-module-auth-client-get-user-activity.query-B6se2sJt.mjs').then((c) => c.AXMGetUserActivityQuery),
3649
4659
  },
3650
4660
  ]),
3651
4661
  {
@@ -3665,39 +4675,43 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
3665
4675
  },
3666
4676
  {
3667
4677
  key: AXMAuthCommandKeys.Session.Signout,
3668
- command: () => import('./acorex-platform-module-auth-client-signout-command-B7n_Fn4P.mjs').then((c) => c.AXPSignoutCommand),
4678
+ command: () => import('./acorex-platform-module-auth-client-signout-command-D4Qgv7q2.mjs').then((c) => c.AXPSignoutCommand),
3669
4679
  },
3670
4680
  {
3671
4681
  key: AXMAuthCommandKeys.Session.OpenSessions,
3672
- command: () => import('./acorex-platform-module-auth-client-open-sessions.command-DKvyMkhl.mjs').then((c) => c.AXPOpenSessionsCommand),
4682
+ command: () => import('./acorex-platform-module-auth-client-open-sessions.command-C9ue1SMV.mjs').then((c) => c.AXPOpenSessionsCommand),
3673
4683
  },
3674
4684
  {
3675
4685
  key: AXMAuthCommandKeys.Session.LockScreen,
3676
- command: () => import('./acorex-platform-module-auth-client-lock-screen.command-DKtlBzS7.mjs').then((c) => c.AXPLockScreenCommand),
4686
+ command: () => import('./acorex-platform-module-auth-client-lock-screen.command-BRGUe-5j.mjs').then((c) => c.AXPLockScreenCommand),
3677
4687
  },
3678
4688
  {
3679
4689
  key: AXMAuthCommandKeys.Profile.ChangePhoto,
3680
- command: () => import('./acorex-platform-module-auth-client-change-photo.command-CzO3A7OG.mjs').then((c) => c.AXPChangePhotoCommand),
4690
+ command: () => import('./acorex-platform-module-auth-client-change-photo.command-CuieLa-Q.mjs').then((c) => c.AXPChangePhotoCommand),
3681
4691
  },
3682
4692
  {
3683
4693
  key: AXMAuthCommandKeys.Profile.EditAccountInfo,
3684
- command: () => import('./acorex-platform-module-auth-client-edit-account-info.command-CD9IrimO.mjs').then((c) => c.AXPEditAccountInfoCommand),
4694
+ command: () => import('./acorex-platform-module-auth-client-edit-account-info.command-DulLUfWs.mjs').then((c) => c.AXPEditAccountInfoCommand),
3685
4695
  },
3686
4696
  {
3687
4697
  key: AXMAuthCommandKeys.Security.ChangePassword,
3688
- command: () => import('./acorex-platform-module-auth-client-change-password.command-BqU3jYV9.mjs').then((c) => c.AXPChangePasswordCommand),
4698
+ command: () => import('./acorex-platform-module-auth-client-change-password.command-ci4weP0r.mjs').then((c) => c.AXPChangePasswordCommand),
4699
+ },
4700
+ {
4701
+ key: AXMAuthCommandKeys.Security.ManageTwoFactor,
4702
+ command: () => import('./acorex-platform-module-auth-client-manage-two-factor.command-t4UEDms3.mjs').then((c) => c.AXPManageTwoFactorCommand),
3689
4703
  },
3690
4704
  {
3691
4705
  key: AXMAuthCommandKeys.Security.SetPinCode,
3692
- command: () => import('./acorex-platform-module-auth-client-set-pin-code.command-FjM1kzUj.mjs').then((c) => c.AXPSetPinCodeCommand),
4706
+ command: () => import('./acorex-platform-module-auth-client-set-pin-code.command-CzUeATL1.mjs').then((c) => c.AXPSetPinCodeCommand),
3693
4707
  },
3694
4708
  {
3695
4709
  key: AXMAuthCommandKeys.Security.RemovePinCode,
3696
- command: () => import('./acorex-platform-module-auth-client-remove-pin-code.command-Da7ryul6.mjs').then((c) => c.AXPRemovePinCodeCommand),
4710
+ command: () => import('./acorex-platform-module-auth-client-remove-pin-code.command-0kRQprWO.mjs').then((c) => c.AXPRemovePinCodeCommand),
3697
4711
  },
3698
4712
  {
3699
4713
  key: AXMAuthCommandKeys.Security.ViewLoginHistory,
3700
- command: () => import('./acorex-platform-module-auth-client-view-login-history.command-Cqb27L-l.mjs').then((c) => c.AXPViewLoginHistoryCommand),
4714
+ command: () => import('./acorex-platform-module-auth-client-view-login-history.command-B35cTU-Z.mjs').then((c) => c.AXPViewLoginHistoryCommand),
3701
4715
  },
3702
4716
  {
3703
4717
  key: AXMAuthCommandKeys.Security.EditSignature,
@@ -3707,47 +4721,76 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
3707
4721
  key: AXMAuthCommandKeys.Profile.ComingSoon,
3708
4722
  command: () => import('./acorex-platform-module-auth-client-profile-coming-soon.command-Crh2GsRA.mjs').then((c) => c.AXPProfileComingSoonCommand),
3709
4723
  },
4724
+ {
4725
+ key: AXMAuthCommandKeys.Onboarding.Welcome,
4726
+ command: () => import('./acorex-platform-module-auth-client-welcome-onboarding.command-Cms-SKKf.mjs').then((c) => c.AXPWelcomeOnboardingCommand),
4727
+ },
4728
+ {
4729
+ key: AXMAuthCommandKeys.Account.OpenWaitingRoom,
4730
+ command: () => import('./acorex-platform-module-auth-client-open-waiting-room.command-CR-_ppYd.mjs').then((c) => c.AXPOpenWaitingRoomCommand),
4731
+ },
3710
4732
  ]),
4733
+ AXPWelcomeOnboardingTriggerService,
3711
4734
  {
3712
- provide: AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER,
4735
+ provide: AXP_HOOK_PROVIDER,
3713
4736
  useValue: ProfileSlotLogoutMenuHookProvider,
3714
4737
  multi: true,
3715
4738
  },
3716
4739
  {
3717
- provide: AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER,
4740
+ provide: AXP_HOOK_PROVIDER,
3718
4741
  useValue: ProfileSlotMyProfileMenuHookProvider,
3719
4742
  multi: true,
3720
4743
  },
3721
4744
  {
3722
- provide: AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER,
4745
+ provide: AXP_HOOK_PROVIDER,
4746
+ useValue: ProfileSlotInstallAppMenuHookProvider,
4747
+ multi: true,
4748
+ },
4749
+ {
4750
+ provide: AXP_HOOK_PROVIDER,
3723
4751
  useValue: ProfileSlotLockMenuHookProvider,
3724
4752
  multi: true,
3725
4753
  },
3726
4754
  {
3727
- provide: AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER,
4755
+ provide: AXP_HOOK_PROVIDER,
3728
4756
  useValue: ProfileSlotPresenceMenuHookProvider,
3729
4757
  multi: true,
3730
4758
  },
3731
4759
  {
3732
- provide: AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER,
4760
+ provide: AXP_HOOK_PROVIDER,
3733
4761
  useValue: CoreProfileGroupsHookProvider,
3734
4762
  multi: true,
3735
4763
  },
3736
4764
  {
3737
- provide: AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER,
4765
+ provide: AXP_HOOK_PROVIDER,
3738
4766
  useValue: CoreProfileSectionsHookProvider,
3739
4767
  multi: true,
3740
4768
  },
3741
4769
  {
3742
- provide: AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER,
4770
+ provide: AXP_HOOK_PROVIDER,
3743
4771
  useValue: SecurityPinSectionHookProvider,
3744
4772
  multi: true,
3745
4773
  },
3746
4774
  {
3747
- provide: AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER,
4775
+ provide: AXP_HOOK_PROVIDER,
3748
4776
  useValue: SecuritySectionsInsightsHookProvider,
3749
4777
  multi: true,
3750
4778
  },
4779
+ {
4780
+ provide: AXP_HOOK_PROVIDER,
4781
+ useValue: WelcomeIntroOnboardingHookProvider,
4782
+ multi: true,
4783
+ },
4784
+ {
4785
+ provide: AXP_HOOK_PROVIDER,
4786
+ useValue: ProfileBasicsOnboardingHookProvider,
4787
+ multi: true,
4788
+ },
4789
+ {
4790
+ provide: AXP_HOOK_PROVIDER,
4791
+ useValue: WelcomeNavigationTypographyOnboardingHookProvider,
4792
+ multi: true,
4793
+ },
3751
4794
  ],
3752
4795
  }]
3753
4796
  }], ctorParameters: () => [] });
@@ -3820,5 +4863,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
3820
4863
  * Generated bundle index. Do not edit.
3821
4864
  */
3822
4865
 
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
4866
+ 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 };
4867
+ //# sourceMappingURL=acorex-platform-module-auth-client-acorex-platform-module-auth-client-DXunSlPC.mjs.map