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

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 (82) hide show
  1. package/fesm2022/{acorex-platform-module-auth-client-acorex-platform-module-auth-client-CTf7qxkQ.mjs → acorex-platform-module-auth-client-acorex-platform-module-auth-client-CRl74b8g.mjs} +275 -92
  2. package/fesm2022/acorex-platform-module-auth-client-acorex-platform-module-auth-client-CRl74b8g.mjs.map +1 -0
  3. package/fesm2022/{acorex-platform-module-auth-client-app-chooser.component-TPCkYJej.mjs → acorex-platform-module-auth-client-app-chooser.component-CjWofUGR.mjs} +5 -5
  4. package/fesm2022/{acorex-platform-module-auth-client-app-chooser.component-TPCkYJej.mjs.map → acorex-platform-module-auth-client-app-chooser.component-CjWofUGR.mjs.map} +1 -1
  5. package/fesm2022/acorex-platform-module-auth-client-blank.layout-BCXNPgrp.mjs.map +1 -1
  6. package/fesm2022/{acorex-platform-module-auth-client-change-password.command-DHwnPkUO.mjs → acorex-platform-module-auth-client-change-password.command-BqU3jYV9.mjs} +2 -2
  7. package/fesm2022/{acorex-platform-module-auth-client-change-password.command-DHwnPkUO.mjs.map → acorex-platform-module-auth-client-change-password.command-BqU3jYV9.mjs.map} +1 -1
  8. package/fesm2022/{acorex-platform-module-auth-client-change-photo.command-BZK_W29M.mjs → acorex-platform-module-auth-client-change-photo.command-CzO3A7OG.mjs} +2 -2
  9. package/fesm2022/{acorex-platform-module-auth-client-change-photo.command-BZK_W29M.mjs.map → acorex-platform-module-auth-client-change-photo.command-CzO3A7OG.mjs.map} +1 -1
  10. package/fesm2022/acorex-platform-module-auth-client-contracts.mjs +63 -1
  11. package/fesm2022/acorex-platform-module-auth-client-contracts.mjs.map +1 -1
  12. package/fesm2022/acorex-platform-module-auth-client-edit-account-info.command-CD9IrimO.mjs.map +1 -1
  13. package/fesm2022/acorex-platform-module-auth-client-edit-signature.command-TjOLhvKL.mjs.map +1 -1
  14. package/fesm2022/{acorex-platform-module-auth-client-get-user-activity.query-DBdELID4.mjs → acorex-platform-module-auth-client-get-user-activity.query-B1bKcSVQ.mjs} +2 -2
  15. package/fesm2022/{acorex-platform-module-auth-client-get-user-activity.query-DBdELID4.mjs.map → acorex-platform-module-auth-client-get-user-activity.query-B1bKcSVQ.mjs.map} +1 -1
  16. package/fesm2022/{acorex-platform-module-auth-client-lock-screen.command-BADSRZxj.mjs → acorex-platform-module-auth-client-lock-screen.command-DKtlBzS7.mjs} +2 -2
  17. package/fesm2022/{acorex-platform-module-auth-client-lock-screen.command-BADSRZxj.mjs.map → acorex-platform-module-auth-client-lock-screen.command-DKtlBzS7.mjs.map} +1 -1
  18. package/fesm2022/{acorex-platform-module-auth-client-login.module-DushGqH6.mjs → acorex-platform-module-auth-client-login.module-CXl61yOu.mjs} +3 -3
  19. package/fesm2022/{acorex-platform-module-auth-client-login.module-DushGqH6.mjs.map → acorex-platform-module-auth-client-login.module-CXl61yOu.mjs.map} +1 -1
  20. package/fesm2022/{acorex-platform-module-auth-client-master.layout-BLUWyFTY.mjs → acorex-platform-module-auth-client-master.layout-D7zUm7aL.mjs} +4 -4
  21. package/fesm2022/{acorex-platform-module-auth-client-master.layout-BLUWyFTY.mjs.map → acorex-platform-module-auth-client-master.layout-D7zUm7aL.mjs.map} +1 -1
  22. package/fesm2022/acorex-platform-module-auth-client-menu.provider-Bz-kRip4.mjs.map +1 -1
  23. package/fesm2022/{acorex-platform-module-auth-client-oauth-callback.component-DnQzPUxF.mjs → acorex-platform-module-auth-client-oauth-callback.component-fdWC08nA.mjs} +3 -3
  24. package/fesm2022/{acorex-platform-module-auth-client-oauth-callback.component-DnQzPUxF.mjs.map → acorex-platform-module-auth-client-oauth-callback.component-fdWC08nA.mjs.map} +1 -1
  25. package/fesm2022/acorex-platform-module-auth-client-open-sessions.command-DKvyMkhl.mjs +265 -0
  26. package/fesm2022/acorex-platform-module-auth-client-open-sessions.command-DKvyMkhl.mjs.map +1 -0
  27. package/fesm2022/{acorex-platform-module-auth-client-password.component-CW0t9fEn.mjs → acorex-platform-module-auth-client-password.component-BE2JkYm_.mjs} +3 -3
  28. package/fesm2022/{acorex-platform-module-auth-client-password.component-CW0t9fEn.mjs.map → acorex-platform-module-auth-client-password.component-BE2JkYm_.mjs.map} +1 -1
  29. package/fesm2022/{acorex-platform-module-auth-client-password.component-D5QDAaKY.mjs → acorex-platform-module-auth-client-password.component-BoWDVby5.mjs} +10 -5
  30. package/fesm2022/acorex-platform-module-auth-client-password.component-BoWDVby5.mjs.map +1 -0
  31. package/fesm2022/acorex-platform-module-auth-client-pin-code.constants-CRsFG7fg.mjs.map +1 -1
  32. package/fesm2022/{acorex-platform-module-auth-client-platform-settings-unavailable.component-BEVkQ3jh.mjs → acorex-platform-module-auth-client-platform-settings-unavailable.component-BJMtsa99.mjs} +4 -4
  33. package/fesm2022/{acorex-platform-module-auth-client-platform-settings-unavailable.component-BEVkQ3jh.mjs.map → acorex-platform-module-auth-client-platform-settings-unavailable.component-BJMtsa99.mjs.map} +1 -1
  34. package/fesm2022/{acorex-platform-module-auth-client-profile-activity-chart.component-o7Eq3zuR.mjs → acorex-platform-module-auth-client-profile-activity-chart.component-CFaRGMKu.mjs} +4 -4
  35. package/fesm2022/{acorex-platform-module-auth-client-profile-activity-chart.component-o7Eq3zuR.mjs.map → acorex-platform-module-auth-client-profile-activity-chart.component-CFaRGMKu.mjs.map} +1 -1
  36. package/fesm2022/acorex-platform-module-auth-client-profile-coming-soon.command-Crh2GsRA.mjs.map +1 -1
  37. package/fesm2022/{acorex-platform-module-auth-client-profile-delete-account-danger-zone.component-D0QS8joQ.mjs → acorex-platform-module-auth-client-profile-delete-account-danger-zone.component-Dx2-o9XL.mjs} +3 -3
  38. package/fesm2022/{acorex-platform-module-auth-client-profile-delete-account-danger-zone.component-D0QS8joQ.mjs.map → acorex-platform-module-auth-client-profile-delete-account-danger-zone.component-Dx2-o9XL.mjs.map} +1 -1
  39. package/fesm2022/{acorex-platform-module-auth-client-profile-page-component.provider-CfQySdD8.mjs → acorex-platform-module-auth-client-profile-page-component.provider-1Spuexhb.mjs} +4 -4
  40. package/fesm2022/{acorex-platform-module-auth-client-profile-page-component.provider-CfQySdD8.mjs.map → acorex-platform-module-auth-client-profile-page-component.provider-1Spuexhb.mjs.map} +1 -1
  41. package/fesm2022/{acorex-platform-module-auth-client-profile-page.component-CPHQXCpS.mjs → acorex-platform-module-auth-client-profile-page.component-CGs24n0j.mjs} +7 -7
  42. package/fesm2022/{acorex-platform-module-auth-client-profile-page.component-CPHQXCpS.mjs.map → acorex-platform-module-auth-client-profile-page.component-CGs24n0j.mjs.map} +1 -1
  43. package/fesm2022/{acorex-platform-module-auth-client-register-password.component-BMHOG5m4.mjs → acorex-platform-module-auth-client-register-password.component-BlOn9609.mjs} +4 -4
  44. package/fesm2022/{acorex-platform-module-auth-client-register-password.component-BMHOG5m4.mjs.map → acorex-platform-module-auth-client-register-password.component-BlOn9609.mjs.map} +1 -1
  45. package/fesm2022/{acorex-platform-module-auth-client-register.module-CFIHZOYj.mjs → acorex-platform-module-auth-client-register.module-CpoYf5uG.mjs} +4 -4
  46. package/fesm2022/{acorex-platform-module-auth-client-register.module-CFIHZOYj.mjs.map → acorex-platform-module-auth-client-register.module-CpoYf5uG.mjs.map} +1 -1
  47. package/fesm2022/{acorex-platform-module-auth-client-remove-pin-code.command-CdlJF48g.mjs → acorex-platform-module-auth-client-remove-pin-code.command-Da7ryul6.mjs} +2 -2
  48. package/fesm2022/{acorex-platform-module-auth-client-remove-pin-code.command-CdlJF48g.mjs.map → acorex-platform-module-auth-client-remove-pin-code.command-Da7ryul6.mjs.map} +1 -1
  49. package/fesm2022/{acorex-platform-module-auth-client-reset-password.component-CcwDb6Wb.mjs → acorex-platform-module-auth-client-reset-password.component-D0nxlhJm.mjs} +3 -3
  50. package/fesm2022/{acorex-platform-module-auth-client-reset-password.component-CcwDb6Wb.mjs.map → acorex-platform-module-auth-client-reset-password.component-D0nxlhJm.mjs.map} +1 -1
  51. package/fesm2022/{acorex-platform-module-auth-client-result.component-DWv1hmQR.mjs → acorex-platform-module-auth-client-result.component-Bo1QkwMu.mjs} +2 -2
  52. package/fesm2022/{acorex-platform-module-auth-client-result.component-DWv1hmQR.mjs.map → acorex-platform-module-auth-client-result.component-Bo1QkwMu.mjs.map} +1 -1
  53. package/fesm2022/{acorex-platform-module-auth-client-routes-IX2qmeqU.mjs → acorex-platform-module-auth-client-routes-B6iJHJ60.mjs} +3 -3
  54. package/fesm2022/{acorex-platform-module-auth-client-routes-IX2qmeqU.mjs.map → acorex-platform-module-auth-client-routes-B6iJHJ60.mjs.map} +1 -1
  55. package/fesm2022/acorex-platform-module-auth-client-session-limit.component-DH58dRba.mjs +195 -0
  56. package/fesm2022/acorex-platform-module-auth-client-session-limit.component-DH58dRba.mjs.map +1 -0
  57. package/fesm2022/{acorex-platform-module-auth-client-session-lock-overlay.component-CcGFA6Op.mjs → acorex-platform-module-auth-client-session-lock-overlay.component-cDCrwNRV.mjs} +5 -5
  58. package/fesm2022/{acorex-platform-module-auth-client-session-lock-overlay.component-CcGFA6Op.mjs.map → acorex-platform-module-auth-client-session-lock-overlay.component-cDCrwNRV.mjs.map} +1 -1
  59. package/fesm2022/{acorex-platform-module-auth-client-set-pin-code.command-BSZhRCN7.mjs → acorex-platform-module-auth-client-set-pin-code.command-FjM1kzUj.mjs} +3 -3
  60. package/fesm2022/{acorex-platform-module-auth-client-set-pin-code.command-BSZhRCN7.mjs.map → acorex-platform-module-auth-client-set-pin-code.command-FjM1kzUj.mjs.map} +1 -1
  61. package/fesm2022/{acorex-platform-module-auth-client-set-pin-code.component-Bm32dRFz.mjs → acorex-platform-module-auth-client-set-pin-code.component-BgEgdFxQ.mjs} +5 -5
  62. package/fesm2022/{acorex-platform-module-auth-client-set-pin-code.component-Bm32dRFz.mjs.map → acorex-platform-module-auth-client-set-pin-code.component-BgEgdFxQ.mjs.map} +1 -1
  63. package/fesm2022/{acorex-platform-module-auth-client-settings.provider-Yaoz8yp3.mjs → acorex-platform-module-auth-client-settings.provider-DGiK-MmW.mjs} +27 -25
  64. package/fesm2022/acorex-platform-module-auth-client-settings.provider-DGiK-MmW.mjs.map +1 -0
  65. package/fesm2022/acorex-platform-module-auth-client-show-profile-command-BWoDxIdx.mjs.map +1 -1
  66. package/fesm2022/acorex-platform-module-auth-client-signout-command-B7n_Fn4P.mjs.map +1 -1
  67. package/fesm2022/{acorex-platform-module-auth-client-tenant-chooser.component-DKTvZ1-I.mjs → acorex-platform-module-auth-client-tenant-chooser.component-B8CNqHx5.mjs} +5 -5
  68. package/fesm2022/{acorex-platform-module-auth-client-tenant-chooser.component-DKTvZ1-I.mjs.map → acorex-platform-module-auth-client-tenant-chooser.component-B8CNqHx5.mjs.map} +1 -1
  69. package/fesm2022/{acorex-platform-module-auth-client-two-factor-code.component-nsB4v25Z.mjs → acorex-platform-module-auth-client-two-factor-code.component-BrqfaY8i.mjs} +3 -3
  70. package/fesm2022/{acorex-platform-module-auth-client-two-factor-code.component-nsB4v25Z.mjs.map → acorex-platform-module-auth-client-two-factor-code.component-BrqfaY8i.mjs.map} +1 -1
  71. package/fesm2022/{acorex-platform-module-auth-client-two-factor.module-BnH72Bob.mjs → acorex-platform-module-auth-client-two-factor.module-CI8KC5M_.mjs} +2 -2
  72. package/fesm2022/{acorex-platform-module-auth-client-two-factor.module-BnH72Bob.mjs.map → acorex-platform-module-auth-client-two-factor.module-CI8KC5M_.mjs.map} +1 -1
  73. package/fesm2022/{acorex-platform-module-auth-client-view-login-history.command-CWmD9wNM.mjs → acorex-platform-module-auth-client-view-login-history.command-Cqb27L-l.mjs} +2 -2
  74. package/fesm2022/{acorex-platform-module-auth-client-view-login-history.command-CWmD9wNM.mjs.map → acorex-platform-module-auth-client-view-login-history.command-Cqb27L-l.mjs.map} +1 -1
  75. package/fesm2022/acorex-platform-module-auth-client.mjs +1 -1
  76. package/package.json +2 -2
  77. package/types/acorex-platform-module-auth-client-contracts.d.ts +30 -2
  78. package/fesm2022/acorex-platform-module-auth-client-acorex-platform-module-auth-client-CTf7qxkQ.mjs.map +0 -1
  79. package/fesm2022/acorex-platform-module-auth-client-open-sessions.command-BHAf7500.mjs +0 -190
  80. package/fesm2022/acorex-platform-module-auth-client-open-sessions.command-BHAf7500.mjs.map +0 -1
  81. package/fesm2022/acorex-platform-module-auth-client-password.component-D5QDAaKY.mjs.map +0 -1
  82. package/fesm2022/acorex-platform-module-auth-client-settings.provider-Yaoz8yp3.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acorex-platform-module-auth-client-open-sessions.command-DKvyMkhl.mjs","sources":["../../../../libs/modules/auth/client/src/lib/pages/account/user-sessions/user-sessions.component.ts","../../../../libs/modules/auth/client/src/lib/pages/account/user-sessions/user-sessions.component.html","../../../../libs/modules/auth/client/src/lib/commands/open-sessions.command.ts"],"sourcesContent":["import { AXButtonModule } from '@acorex/components/button';\nimport { AXDataSource, AXValueChangedEvent } from '@acorex/cdk/common';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXDropdownModule } from '@acorex/components/dropdown';\nimport { AXPopoverModule } from '@acorex/components/popover';\nimport { AXSelectBoxModule } from '@acorex/components/select-box';\nimport { AXBasePageComponent } from '@acorex/components/page';\nimport { AXFormatModule, AXFormatService } from '@acorex/core/format';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { AXPSettingsService } from '@acorex-platform/framework-client/common';\nimport { AXPRegionalSetting } from '@acorex-platform/framework-shared/core';\nimport { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n inject,\n signal,\n ViewEncapsulation,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport {\n AXPAuthInactiveSessionTerminationValue,\n AXPAuthSettings,\n AXP_AUTH_INACTIVE_SESSION_TERMINATION_OPTION_DEFINITIONS,\n isAuthInactiveSessionTerminationValue,\n} from '@acorex-platform/module-auth-client/contracts';\nimport { AXMSecurityManagementDeviceSessionsEntityModel } from '@acorex-platform/module-security-management-client/contracts';\nimport { AXMUserDeviceSessionsService } from './user-sessions.service';\n\n//#region ----- Types -----\n\ninterface TranslatedInactiveSessionTerminationOption {\n id: AXPAuthInactiveSessionTerminationValue;\n name: string;\n}\n\ninterface SessionListItem extends AXMSecurityManagementDeviceSessionsEntityModel {\n icon: string;\n title: string;\n subtitle: string;\n metaLabel: string;\n}\n\ninterface ActiveSessionView {\n session: AXMSecurityManagementDeviceSessionsEntityModel;\n title: string;\n subtitle: string;\n metaLabel: string;\n}\n\n//#endregion\n\n//#region ----- Constants -----\n\nconst ONE_WEEK_MS = 7 * 24 * 60 * 60 * 1000;\n\n//#endregion\n\n//#region ----- Helpers -----\n\nfunction parseSessionDate(value: Date | string | number | null | undefined): Date | undefined {\n if (value instanceof Date) {\n return Number.isNaN(value.getTime()) ? undefined : value;\n }\n if (typeof value === 'string' || typeof value === 'number') {\n const parsed = new Date(value);\n return Number.isNaN(parsed.getTime()) ? undefined : parsed;\n }\n return undefined;\n}\n\n/** Drops year tokens from a regional date pattern (keeps day/month + separators). */\nfunction omitYearFromDateFormat(format: string): string {\n let result = format.replace(/Y{2,4}/gi, '').replace(/y{2,4}/g, '');\n result = result.replace(/^[/\\-.\\s]+|[/\\-.\\s]+$/g, '');\n result = result.replace(/[/\\-.\\s]{2,}/g, (match) => match.charAt(0));\n return result.trim() || format;\n}\n\n//#endregion\n\n@Component({\n selector: 'axm-user-sessions',\n templateUrl: './user-sessions.component.html',\n styleUrl: './user-sessions.component.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: { class: 'axm-user-sessions' },\n imports: [\n AXButtonModule,\n AXDecoratorModule,\n CommonModule,\n FormsModule,\n AXFormatModule,\n AXSelectBoxModule,\n AXDropdownModule,\n AXPopoverModule,\n AXTranslationModule,\n ],\n})\nexport class AXMUserSessionsComponent extends AXBasePageComponent {\n //#region ----- State -----\n\n items = signal<SessionListItem[]>([]);\n activeSessionView = signal<ActiveSessionView | undefined>(undefined);\n expireTime = signal<AXPAuthInactiveSessionTerminationValue | null>(null);\n\n //#endregion\n\n //#region ----- Services & Dependencies -----\n\n private readonly userDeviceSessionsService = inject(AXMUserDeviceSessionsService);\n private readonly settingsService = inject(AXPSettingsService);\n private readonly translateService = inject(AXTranslationService);\n private readonly formatService = inject(AXFormatService);\n private readonly cdRef = inject(ChangeDetectorRef);\n\n //#endregion\n\n //#region ----- Data Sources -----\n\n protected expirationItems: TranslatedInactiveSessionTerminationOption[] = [];\n\n protected dataSource = new AXDataSource<TranslatedInactiveSessionTerminationOption>({\n pageSize: 10,\n key: 'id',\n load: async () => ({\n items: this.expirationItems,\n total: this.expirationItems.length,\n }),\n });\n\n //#endregion\n\n //#region ----- Lifecycle -----\n\n constructor() {\n super();\n void this.loadUserSessions();\n }\n\n //#endregion\n\n //#region ----- UI Handlers -----\n\n getSessionIcon(session: AXMSecurityManagementDeviceSessionsEntityModel | undefined): string {\n if (!session) {\n return 'fa-solid fa-question';\n }\n\n const haystack = [session.browser, session.operatingSystem, session.deviceName]\n .map((part) => (part ?? '').toLowerCase())\n .join(' ');\n\n if (haystack.includes('firefox')) {\n return 'fa-brands fa-firefox';\n }\n if (haystack.includes('chrome') || haystack.includes('chromium')) {\n return 'fa-brands fa-chrome';\n }\n if (haystack.includes('edge')) {\n return 'fa-brands fa-edge';\n }\n if (haystack.includes('safari')) {\n return 'fa-brands fa-safari';\n }\n if (haystack.includes('opera')) {\n return 'fa-brands fa-opera';\n }\n if (haystack.includes('windows')) {\n return 'fa-brands fa-windows';\n }\n if (haystack.includes('mac') || haystack.includes('iphone') || haystack.includes('ipad') || haystack.includes('ios')) {\n return 'fa-brands fa-apple';\n }\n if (haystack.includes('android')) {\n return 'fa-brands fa-android';\n }\n if (haystack.includes('linux')) {\n return 'fa-brands fa-linux';\n }\n\n return 'fa-solid fa-desktop';\n }\n\n protected onChangeSessionExpireTime(e: AXValueChangedEvent): void {\n const selectedId = e.component.selectedItems[0]?.id as AXPAuthInactiveSessionTerminationValue | undefined;\n if (!selectedId) {\n return;\n }\n\n this.expireTime.set(selectedId);\n void this.userDeviceSessionsService.setInactiveSessionTermination(selectedId);\n }\n\n async onTerminate(sessionId: string | undefined): Promise<void> {\n if (!sessionId) {\n console.error('No item to terminate');\n return;\n }\n\n // Never terminate the current browser session from a row action.\n if (sessionId === this.activeSessionView()?.session.id) {\n return;\n }\n\n await this.userDeviceSessionsService.terminateSession(sessionId);\n await this.loadUserSessions();\n }\n\n async onTerminateAll(): Promise<void> {\n await this.userDeviceSessionsService.terminateAllSession();\n await this.loadUserSessions();\n }\n\n //#endregion\n\n //#region ----- Private Methods -----\n\n private async resolveSessionMeta(\n session: AXMSecurityManagementDeviceSessionsEntityModel,\n ): Promise<string> {\n const place =\n (session.location ?? '').trim() ||\n (await this.translateService.translateAsync('@auth:sessions.meta.unknown-location'));\n const detailParts = [place, (session.ipAddress ?? '').trim()].filter(Boolean);\n const placeAndIp = detailParts.join(' · ');\n const lastSeen = await this.resolveLastSeenLabel(session.lastLoginDate);\n if (!lastSeen) {\n return placeAndIp;\n }\n return `${placeAndIp}, ${lastSeen}`;\n }\n\n private formatSessionTitle(session: AXMSecurityManagementDeviceSessionsEntityModel): string {\n return [session.deviceName, session.browser]\n .map((part) => (part ?? '').trim())\n .filter(Boolean)\n .join(' · ');\n }\n\n private formatSessionSubtitle(session: AXMSecurityManagementDeviceSessionsEntityModel): string {\n return (session.operatingSystem ?? '').trim();\n }\n\n private async resolveLastSeenLabel(\n lastLoginDate: Date | string | number | null | undefined,\n ): Promise<string> {\n const date = parseSessionDate(lastLoginDate);\n if (!date) {\n return '';\n }\n\n const ageMs = Date.now() - date.getTime();\n if (ageMs >= 0 && ageMs < ONE_WEEK_MS) {\n return this.formatService.format(date, 'timeleft');\n }\n\n const dateFormat = await this.settingsService.get<string>(AXPRegionalSetting.ShortDate);\n const timeFormat = await this.settingsService.get<string>(AXPRegionalSetting.ShortTime);\n const sameYear = date.getFullYear() === new Date().getFullYear();\n const datePart = sameYear ? omitYearFromDateFormat(dateFormat ?? '') : (dateFormat ?? '');\n const format = `${datePart} ${timeFormat ?? ''}`.trim();\n return this.formatService.format(date, 'datetime', { format });\n }\n\n private async loadUserSessions(): Promise<void> {\n try {\n // Options come from the auth settings definition (shared contracts catalog).\n this.expirationItems = await Promise.all(\n AXP_AUTH_INACTIVE_SESSION_TERMINATION_OPTION_DEFINITIONS.map(async (option) => ({\n id: option.id,\n name: await this.translateService.translateAsync(option.titleKey),\n })),\n );\n\n const sessions = await this.userDeviceSessionsService.getSessions();\n const items = await Promise.all(\n sessions.map(async (item) => ({\n ...item,\n icon: this.getSessionIcon(item),\n title: this.formatSessionTitle(item),\n subtitle: this.formatSessionSubtitle(item),\n metaLabel: await this.resolveSessionMeta(item),\n })),\n );\n this.items.set(items);\n\n try {\n const activeSession = await this.userDeviceSessionsService.getCurrentActiveSessions();\n this.activeSessionView.set({\n session: activeSession,\n title: this.formatSessionTitle(activeSession),\n subtitle: this.formatSessionSubtitle(activeSession),\n metaLabel: await this.resolveSessionMeta(activeSession),\n });\n } catch (error) {\n console.warn('No active session found:', error);\n this.activeSessionView.set(undefined);\n }\n\n const inactiveSessionTermination = await this.settingsService.get(\n AXPAuthSettings.InactiveSessionTermination,\n );\n\n if (isAuthInactiveSessionTerminationValue(inactiveSessionTermination)) {\n this.expireTime.set(inactiveSessionTermination);\n }\n\n await this.dataSource.refresh();\n this.cdRef.markForCheck();\n } catch (error) {\n console.error('Error loading user sessions', error);\n }\n }\n\n //#endregion\n}\n","<ax-content>\n <div class=\"axm-user-sessions__content flex flex-col gap-4 p-6 w-full min-w-0\">\n <!-- ----- This device (current session) ----- -->\n <p class=\"font-semibold text-base text-on-lightest text-start m-0\">\n {{ '@auth:sessions.this-device.title' | translate | async }}\n </p>\n <div class=\"axm-user-sessions__row\">\n <div class=\"axm-user-sessions__icon axm-user-sessions__icon--primary\">\n <i class=\"{{ getSessionIcon(activeSessionView()?.session) }}\"></i>\n </div>\n <!--->\n <!-- ----- Current session details when available ----- -->\n @if (activeSessionView(); as current) {\n <div class=\"flex min-w-0 flex-1 flex-col text-start\">\n <div class=\"font-medium text-base\">{{ current.title }}</div>\n @if (current.subtitle) {\n <div class=\"font-normal text-sm\">{{ current.subtitle }}</div>\n }\n <p class=\"axm-user-sessions__meta m-0 font-normal text-xs\">{{ current.metaLabel }}</p>\n </div>\n }\n </div>\n\n <!--->\n <!-- ----- Other sessions: terminate-all + device list ----- -->\n @if (items().length > 0) {\n <!-- ----- Terminate all other sessions (never current) ----- -->\n <div\n class=\"axm-user-sessions__row cursor-pointer\"\n role=\"button\"\n tabindex=\"0\"\n (click)=\"onTerminateAll()\"\n (keydown.enter)=\"onTerminateAll()\"\n >\n <div class=\"axm-user-sessions__icon axm-user-sessions__icon--danger\">\n <i class=\"ax-icon ax-icon-clear\"></i>\n </div>\n <div class=\"flex min-w-0 flex-1 flex-col text-start\">\n <div class=\"font-medium text-base\">\n {{ '@auth:sessions.terminate-all.title' | translate | async }}\n </div>\n <p class=\"axm-user-sessions__meta m-0 font-normal text-sm\">\n {{ '@auth:sessions.terminate-all.description' | translate | async }}\n </p>\n </div>\n </div>\n\n <!-- ----- Other active devices ----- -->\n <p class=\"font-semibold text-base text-on-lightest text-start m-0\">\n {{ '@auth:sessions.active-devices.title' | translate | async }}\n </p>\n @for (item of items(); track item.id) {\n <div class=\"axm-user-sessions__row\">\n <div class=\"axm-user-sessions__icon\">\n <i class=\"{{ item.icon }}\"></i>\n </div>\n <div class=\"flex min-w-0 flex-1 flex-col text-start\">\n <div class=\"font-medium text-base\">{{ item.title }}</div>\n @if (item.subtitle) {\n <div class=\"font-normal text-sm\">{{ item.subtitle }}</div>\n }\n <p class=\"axm-user-sessions__meta m-0 font-normal text-xs\">{{ item.metaLabel }}</p>\n </div>\n <ax-button\n class=\"axm-user-sessions__action\"\n look=\"blank\"\n color=\"danger\"\n [attr.aria-label]=\"('@general:actions.remove.title' | translate | async) ?? ''\"\n (onClick)=\"onTerminate(item.id)\"\n >\n <ax-icon icon=\"fa-light fa-xmark\"></ax-icon>\n </ax-button>\n </div>\n }\n }\n </div>\n</ax-content>\n<ax-footer>\n <ax-suffix>\n <div class=\"axm-user-sessions__footer flex w-full min-w-0 flex-col gap-1 px-4 py-2\">\n <p class=\"m-0 text-start font-medium text-base text-danger-500\">\n {{ '@auth:sessions.terminate-old.title' | translate | async }}\n </p>\n <div class=\"axm-user-sessions__footer-setting\">\n <div class=\"axm-user-sessions__footer-label font-normal text-base text-on-lightest text-start\">\n {{ '@auth:sessions.terminate-old.inactive-for' | translate | async }}\n </div>\n <div class=\"axm-user-sessions__footer-select\">\n <ax-select-box\n [ngModel]=\"expireTime()\"\n (onValueChanged)=\"onChangeSessionExpireTime($event)\"\n [dataSource]=\"dataSource\"\n textField=\"name\"\n valueField=\"id\"\n [placeholder]=\"('@auth:sessions.terminate-old.placeholder' | translate | async) ?? ''\"\n >\n </ax-select-box>\n </div>\n </div>\n </div>\n </ax-suffix>\n</ax-footer>\n","import { AXPCommand, type AXPCommandExecuteResultPromise } from '@acorex-platform/framework-shared/runtime';\nimport { AXPopupService } from '@acorex/components/popup';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { AXPRuntimeCommandResult } from '@acorex-platform/framework-shared/core';\n\nimport { inject, Injectable } from '@angular/core';\nimport { AXMUserSessionsComponent } from '../pages/account/user-sessions/user-sessions.component';\n\n//#region ---- Open sessions command ----\n\n/** Opens the active sessions popup for the current user. */\n@Injectable({ providedIn: 'root' })\nexport class AXPOpenSessionsCommand implements AXPCommand {\n //#region ---- Services & Dependencies ----\n\n private readonly popupService = inject(AXPopupService);\n private readonly translateService = inject(AXTranslationService);\n\n //#endregion\n\n //#region ---- Command ----\n\n async execute(): AXPCommandExecuteResultPromise<void> {\n await this.popupService.open(AXMUserSessionsComponent, {\n title: await this.translateService.translateAsync('@auth:profile.sessions'),\n size: 'md',\n });\n\n return { success: true, kind: 'object', data: undefined };\n }\n\n //#endregion\n}\n\n//#endregion\n"],"names":["i3","i6"],"mappings":"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"}
@@ -11,7 +11,7 @@ import { AXTextBoxModule } from '@acorex/components/text-box';
11
11
  import { AXToastService } from '@acorex/components/toast';
12
12
  import * as i5 from '@acorex/core/translation';
13
13
  import { AXTranslationService, AXTranslationModule } from '@acorex/core/translation';
14
- import * as i3$1 from '@angular/common';
14
+ import * as i5$1 from '@angular/common';
15
15
  import { CommonModule } from '@angular/common';
16
16
  import * as i0 from '@angular/core';
17
17
  import { inject, ChangeDetectionStrategy, Component } from '@angular/core';
@@ -68,7 +68,7 @@ class AXPForgetPasswordComponent {
68
68
  }
69
69
  }
70
70
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPForgetPasswordComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
71
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.8", type: AXPForgetPasswordComponent, isStandalone: true, selector: "ng-component", ngImport: i0, template: "<ng-container *translate=\"let t\">\n <div class=\"axp-auth-form\">\n <div class=\"text-center mb-3 lg:mb-5\">\n <h1 class=\"font-bold text-xl mb-1 lg:mb-2\">\n {{ '@auth:forgot.password' | translate | async }}\n </h1>\n <p class=\"text-base text-neutral-600\">\n {{ '@auth:forgot.hint' | translate | async }}\n </p>\n </div>\n <ax-form>\n <div class=\"flex flex-col gap-4 lg:gap-6\">\n <ax-form-field>\n <ax-label>{{ '@auth:username-email' | translate | async }}</ax-label>\n <ax-text-box\n name=\"login\"\n [(value)]=\"login\"\n [disabled]=\"submitting || submitted\"\n ></ax-text-box>\n </ax-form-field>\n </div>\n <ax-button\n color=\"primary\"\n class=\"mt-4 lg:mt-6 w-full\"\n [text]=\"'@auth:forgot.submit' | translate | async\"\n [disabled]=\"submitting || submitted || !login.trim()\"\n (onClick)=\"submit()\"\n ></ax-button>\n <p class=\"text-center mt-6 text-neutral-400 text-sm\">\n {{ '@auth:tenant-chooser.footer' | translate | async }}\n <a\n [routerLink]=\"['/auth/login']\"\n class=\"text-primary font-medium cursor-pointer hover:underline\"\n >\n {{ '@auth:backLogin' | translate | async }}\n </a>\n </p>\n </ax-form>\n </div>\n</ng-container>\n", styles: [":host{display:block;width:100%}.axp-auth-form{width:100%;margin-inline:auto}@media(min-width:768px){.axp-auth-form{width:24rem;max-width:100%}}.axp-auth-form ax-form,.axp-auth-form ax-form-field,.axp-auth-form ax-text-box{display:block;width:100%}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXFormModule }, { kind: "component", type: i1.AXFormFieldComponent, selector: "ax-form-field", inputs: ["labelMode"] }, { kind: "component", type: i1.AXFormComponent, selector: "ax-form", inputs: ["disabled", "readonly", "labelMode", "look", "messageStyle", "updateOn", "inUserInteractionActive"], outputs: ["onValidate", "updateOnChange"] }, { kind: "ngmodule", type: AXTextBoxModule }, { kind: "component", type: i2.AXTextBoxComponent, selector: "ax-text-box", inputs: ["disabled", "tabIndex", "readonly", "value", "state", "name", "id", "placeholder", "maxLength", "allowNull", "type", "autoComplete", "look", "maskPattern", "customTokens", "class"], outputs: ["onBlur", "onFocus", "valueChange", "stateChange", "onValueChanged", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress", "onMaskChanged"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXLabelModule }, { kind: "component", type: i3.AXLabelComponent, selector: "ax-label", inputs: ["required", "for"], outputs: ["requiredChange"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "directive", type: i5.AXTranslatorDirective, selector: "[translate]" }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1$2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "browserUrl", "routerLink"] }, { kind: "pipe", type: i3$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
71
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.8", type: AXPForgetPasswordComponent, isStandalone: true, selector: "ng-component", ngImport: i0, template: "<ng-container *translate=\"let t\">\n <div class=\"axp-auth-form\">\n <div class=\"text-center mb-3 lg:mb-5\">\n <h1 class=\"font-bold text-xl mb-1 lg:mb-2\">\n {{ '@auth:forgot.password' | translate | async }}\n </h1>\n <p class=\"text-base text-neutral-600\">\n {{ '@auth:forgot.hint' | translate | async }}\n </p>\n </div>\n <ax-form>\n <div class=\"flex flex-col gap-4 lg:gap-6\">\n <ax-form-field>\n <ax-label>{{ '@auth:username-email' | translate | async }}</ax-label>\n <ax-text-box\n name=\"login\"\n [(value)]=\"login\"\n [disabled]=\"submitting || submitted\"\n ></ax-text-box>\n </ax-form-field>\n </div>\n <ax-button\n color=\"primary\"\n class=\"mt-4 lg:mt-6 w-full\"\n [text]=\"'@auth:forgot.submit' | translate | async\"\n [disabled]=\"submitting || submitted || !login.trim()\"\n (onClick)=\"submit()\"\n ></ax-button>\n <p class=\"text-center mt-6 text-neutral-400 text-sm\">\n {{ '@auth:tenant-chooser.footer' | translate | async }}\n <a\n [routerLink]=\"['/auth/login']\"\n class=\"text-primary font-medium cursor-pointer hover:underline\"\n >\n {{ '@auth:backLogin' | translate | async }}\n </a>\n </p>\n </ax-form>\n </div>\n</ng-container>\n", styles: [":host{display:block;width:100%}.axp-auth-form{width:100%;margin-inline:auto}@media(min-width:768px){.axp-auth-form{width:24rem;max-width:100%}}.axp-auth-form ax-form,.axp-auth-form ax-form-field,.axp-auth-form ax-text-box{display:block;width:100%}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXFormModule }, { kind: "component", type: i1.AXFormFieldComponent, selector: "ax-form-field", inputs: ["labelMode"] }, { kind: "component", type: i1.AXFormComponent, selector: "ax-form", inputs: ["disabled", "readonly", "labelMode", "look", "messageStyle", "updateOn", "inUserInteractionActive"], outputs: ["onValidate", "updateOnChange"] }, { kind: "ngmodule", type: AXTextBoxModule }, { kind: "component", type: i2.AXTextBoxComponent, selector: "ax-text-box", inputs: ["disabled", "tabIndex", "readonly", "value", "state", "name", "id", "placeholder", "maxLength", "allowNull", "type", "autoComplete", "look", "maskPattern", "customTokens", "class"], outputs: ["onBlur", "onFocus", "valueChange", "stateChange", "onValueChanged", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress", "onMaskChanged"] }, { 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: AXLabelModule }, { kind: "component", type: i3.AXLabelComponent, selector: "ax-label", inputs: ["required", "for"], outputs: ["requiredChange"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "directive", type: i5.AXTranslatorDirective, selector: "[translate]" }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1$2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "browserUrl", "routerLink"] }, { kind: "pipe", type: i5$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
72
72
  }
73
73
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPForgetPasswordComponent, decorators: [{
74
74
  type: Component,
@@ -84,4 +84,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
84
84
  }] });
85
85
 
86
86
  export { AXPForgetPasswordComponent };
87
- //# sourceMappingURL=acorex-platform-module-auth-client-password.component-CW0t9fEn.mjs.map
87
+ //# sourceMappingURL=acorex-platform-module-auth-client-password.component-BE2JkYm_.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"acorex-platform-module-auth-client-password.component-CW0t9fEn.mjs","sources":["../../../../libs/modules/auth/client/src/lib/pages/forgot/password/password.component.ts","../../../../libs/modules/auth/client/src/lib/pages/forgot/password/password.component.html"],"sourcesContent":["import { AXPCommandService } from '@acorex-platform/framework-client/runtime';\nimport { AXMSecurityManagementServerCommands } from '@acorex-platform/module-security-management-client/contracts';\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXFormModule } from '@acorex/components/form';\nimport { AXLabelModule } from '@acorex/components/label';\nimport { AXTextBoxModule } from '@acorex/components/text-box';\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { RouterModule } from '@angular/router';\n\n@Component({\n templateUrl: './password.component.html',\n styleUrls: ['./password.component.css'],\n changeDetection: ChangeDetectionStrategy.Eager,\n imports: [\n CommonModule,\n AXFormModule,\n AXTextBoxModule,\n AXButtonModule,\n AXLabelModule,\n AXTranslationModule,\n RouterModule,\n ],\n})\nexport class AXPForgetPasswordComponent {\n private readonly commandService = inject(AXPCommandService);\n private readonly toast = inject(AXToastService);\n private readonly translation = inject(AXTranslationService);\n\n protected login = '';\n protected submitting = false;\n protected submitted = false;\n\n protected async submit(): Promise<void> {\n const login = this.login.trim();\n if (!login || this.submitting) {\n return;\n }\n\n this.submitting = true;\n try {\n const result = await this.commandService.execute(\n AXMSecurityManagementServerCommands.SendPasswordResetEmail,\n {\n login,\n webOrigin:\n typeof window !== 'undefined' ? window.location.origin : undefined,\n },\n );\n if (!result?.success) {\n throw new Error('request failed');\n }\n this.submitted = true;\n const [title, content] = await Promise.all([\n this.translation\n .translateAsync('@auth:forgot.success.title')\n .catch(() => 'Check Your Email'),\n this.translation\n .translateAsync('@auth:forgot.success.description')\n .catch(\n () =>\n 'If an account exists, a password reset email has been sent.',\n ),\n ]);\n this.toast.show({ color: 'success', title, content, timeOut: 4000 });\n } catch {\n const [title, content] = await Promise.all([\n this.translation\n .translateAsync('@auth:forgot.error.title')\n .catch(() => 'Request Failed'),\n this.translation\n .translateAsync('@auth:forgot.error.description')\n .catch(\n () =>\n 'Unable to send password reset email. Please try again later.',\n ),\n ]);\n this.toast.show({ color: 'danger', title, content, timeOut: 4000 });\n } finally {\n this.submitting = false;\n }\n }\n}\n","<ng-container *translate=\"let t\">\n <div class=\"axp-auth-form\">\n <div class=\"text-center mb-3 lg:mb-5\">\n <h1 class=\"font-bold text-xl mb-1 lg:mb-2\">\n {{ '@auth:forgot.password' | translate | async }}\n </h1>\n <p class=\"text-base text-neutral-600\">\n {{ '@auth:forgot.hint' | translate | async }}\n </p>\n </div>\n <ax-form>\n <div class=\"flex flex-col gap-4 lg:gap-6\">\n <ax-form-field>\n <ax-label>{{ '@auth:username-email' | translate | async }}</ax-label>\n <ax-text-box\n name=\"login\"\n [(value)]=\"login\"\n [disabled]=\"submitting || submitted\"\n ></ax-text-box>\n </ax-form-field>\n </div>\n <ax-button\n color=\"primary\"\n class=\"mt-4 lg:mt-6 w-full\"\n [text]=\"'@auth:forgot.submit' | translate | async\"\n [disabled]=\"submitting || submitted || !login.trim()\"\n (onClick)=\"submit()\"\n ></ax-button>\n <p class=\"text-center mt-6 text-neutral-400 text-sm\">\n {{ '@auth:tenant-chooser.footer' | translate | async }}\n <a\n [routerLink]=\"['/auth/login']\"\n class=\"text-primary font-medium cursor-pointer hover:underline\"\n >\n {{ '@auth:backLogin' | translate | async }}\n </a>\n </p>\n </ax-form>\n </div>\n</ng-container>\n"],"names":["i3","i4","i6","i7"],"mappings":"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"}
1
+ {"version":3,"file":"acorex-platform-module-auth-client-password.component-BE2JkYm_.mjs","sources":["../../../../libs/modules/auth/client/src/lib/pages/forgot/password/password.component.ts","../../../../libs/modules/auth/client/src/lib/pages/forgot/password/password.component.html"],"sourcesContent":["import { AXPCommandService } from '@acorex-platform/framework-client/runtime';\nimport { AXMSecurityManagementServerCommands } from '@acorex-platform/module-security-management-client/contracts';\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXFormModule } from '@acorex/components/form';\nimport { AXLabelModule } from '@acorex/components/label';\nimport { AXTextBoxModule } from '@acorex/components/text-box';\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { RouterModule } from '@angular/router';\n\n@Component({\n templateUrl: './password.component.html',\n styleUrls: ['./password.component.css'],\n changeDetection: ChangeDetectionStrategy.Eager,\n imports: [\n CommonModule,\n AXFormModule,\n AXTextBoxModule,\n AXButtonModule,\n AXLabelModule,\n AXTranslationModule,\n RouterModule,\n ],\n})\nexport class AXPForgetPasswordComponent {\n private readonly commandService = inject(AXPCommandService);\n private readonly toast = inject(AXToastService);\n private readonly translation = inject(AXTranslationService);\n\n protected login = '';\n protected submitting = false;\n protected submitted = false;\n\n protected async submit(): Promise<void> {\n const login = this.login.trim();\n if (!login || this.submitting) {\n return;\n }\n\n this.submitting = true;\n try {\n const result = await this.commandService.execute(\n AXMSecurityManagementServerCommands.SendPasswordResetEmail,\n {\n login,\n webOrigin:\n typeof window !== 'undefined' ? window.location.origin : undefined,\n },\n );\n if (!result?.success) {\n throw new Error('request failed');\n }\n this.submitted = true;\n const [title, content] = await Promise.all([\n this.translation\n .translateAsync('@auth:forgot.success.title')\n .catch(() => 'Check Your Email'),\n this.translation\n .translateAsync('@auth:forgot.success.description')\n .catch(\n () =>\n 'If an account exists, a password reset email has been sent.',\n ),\n ]);\n this.toast.show({ color: 'success', title, content, timeOut: 4000 });\n } catch {\n const [title, content] = await Promise.all([\n this.translation\n .translateAsync('@auth:forgot.error.title')\n .catch(() => 'Request Failed'),\n this.translation\n .translateAsync('@auth:forgot.error.description')\n .catch(\n () =>\n 'Unable to send password reset email. Please try again later.',\n ),\n ]);\n this.toast.show({ color: 'danger', title, content, timeOut: 4000 });\n } finally {\n this.submitting = false;\n }\n }\n}\n","<ng-container *translate=\"let t\">\n <div class=\"axp-auth-form\">\n <div class=\"text-center mb-3 lg:mb-5\">\n <h1 class=\"font-bold text-xl mb-1 lg:mb-2\">\n {{ '@auth:forgot.password' | translate | async }}\n </h1>\n <p class=\"text-base text-neutral-600\">\n {{ '@auth:forgot.hint' | translate | async }}\n </p>\n </div>\n <ax-form>\n <div class=\"flex flex-col gap-4 lg:gap-6\">\n <ax-form-field>\n <ax-label>{{ '@auth:username-email' | translate | async }}</ax-label>\n <ax-text-box\n name=\"login\"\n [(value)]=\"login\"\n [disabled]=\"submitting || submitted\"\n ></ax-text-box>\n </ax-form-field>\n </div>\n <ax-button\n color=\"primary\"\n class=\"mt-4 lg:mt-6 w-full\"\n [text]=\"'@auth:forgot.submit' | translate | async\"\n [disabled]=\"submitting || submitted || !login.trim()\"\n (onClick)=\"submit()\"\n ></ax-button>\n <p class=\"text-center mt-6 text-neutral-400 text-sm\">\n {{ '@auth:tenant-chooser.footer' | translate | async }}\n <a\n [routerLink]=\"['/auth/login']\"\n class=\"text-primary font-medium cursor-pointer hover:underline\"\n >\n {{ '@auth:backLogin' | translate | async }}\n </a>\n </p>\n </ax-form>\n </div>\n</ng-container>\n"],"names":["i3","i4","i6","i7"],"mappings":"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"}
@@ -16,7 +16,7 @@ import * as i2 from '@acorex/components/text-box';
16
16
  import { AXTextBoxModule } from '@acorex/components/text-box';
17
17
  import * as i5 from '@acorex/core/translation';
18
18
  import { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';
19
- import * as i3$2 from '@angular/common';
19
+ import * as i5$1 from '@angular/common';
20
20
  import { CommonModule } from '@angular/common';
21
21
  import * as i0 from '@angular/core';
22
22
  import { signal, ChangeDetectionStrategy, Component, inject, Injector, effect, ViewContainerRef, ViewChild } from '@angular/core';
@@ -30,7 +30,7 @@ import { AXPRegionalSetting } from '@acorex-platform/framework-shared/core';
30
30
  import * as i1$2 from '@angular/forms';
31
31
  import { FormsModule } from '@angular/forms';
32
32
  import { BehaviorSubject, firstValueFrom } from 'rxjs';
33
- import { B as AXPLoginExternalProvidersComponent, t as AXMAuthPlatformSettingsService, D as AXMAuthenticationTypes } from './acorex-platform-module-auth-client-acorex-platform-module-auth-client-CTf7qxkQ.mjs';
33
+ import { B as AXPLoginExternalProvidersComponent, t as AXMAuthPlatformSettingsService, D as AXMAuthenticationTypes } from './acorex-platform-module-auth-client-acorex-platform-module-auth-client-CRl74b8g.mjs';
34
34
 
35
35
  //#region ---- Default Challenge Component ----
36
36
  /**
@@ -111,7 +111,7 @@ class AXPDefaultChallengeComponent extends AXPLoginChallengeComponentBase {
111
111
  </ax-text-box>
112
112
  </ax-form-field>
113
113
  </div>
114
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXTextBoxModule }, { kind: "component", type: i2.AXTextBoxComponent, selector: "ax-text-box", inputs: ["disabled", "tabIndex", "readonly", "value", "state", "name", "id", "placeholder", "maxLength", "allowNull", "type", "autoComplete", "look", "maskPattern", "customTokens", "class"], outputs: ["onBlur", "onFocus", "valueChange", "stateChange", "onValueChanged", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress", "onMaskChanged"] }, { kind: "ngmodule", type: AXLabelModule }, { kind: "component", type: i3.AXLabelComponent, selector: "ax-label", inputs: ["required", "for"], outputs: ["requiredChange"] }, { kind: "ngmodule", type: AXFormModule }, { kind: "component", type: i1$1.AXFormFieldComponent, selector: "ax-form-field", inputs: ["labelMode"] }, { kind: "directive", type: i1$1.AXValidationRuleDirective, selector: "ax-validation-rule", inputs: ["rule", "options", "message", "disabled"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i3$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "component", type: i2$1.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "ngmodule", type: AXValidationModule }, { kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i5.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: i3$2.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
114
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.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: AXTextBoxModule }, { kind: "component", type: i2.AXTextBoxComponent, selector: "ax-text-box", inputs: ["disabled", "tabIndex", "readonly", "value", "state", "name", "id", "placeholder", "maxLength", "allowNull", "type", "autoComplete", "look", "maskPattern", "customTokens", "class"], outputs: ["onBlur", "onFocus", "valueChange", "stateChange", "onValueChanged", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress", "onMaskChanged"] }, { kind: "ngmodule", type: AXLabelModule }, { kind: "component", type: i3.AXLabelComponent, selector: "ax-label", inputs: ["required", "for"], outputs: ["requiredChange"] }, { kind: "ngmodule", type: AXFormModule }, { kind: "component", type: i1$1.AXFormFieldComponent, selector: "ax-form-field", inputs: ["labelMode"] }, { kind: "directive", type: i1$1.AXValidationRuleDirective, selector: "ax-validation-rule", inputs: ["rule", "options", "message", "disabled"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i3$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "component", type: i2$1.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "ngmodule", type: AXValidationModule }, { kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i5.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: i5$1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
115
115
  }
116
116
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPDefaultChallengeComponent, decorators: [{
117
117
  type: Component,
@@ -305,6 +305,7 @@ class AXPLoginPasswordComponent {
305
305
  strategy: strategyName,
306
306
  username: this.v1,
307
307
  password: this.v2,
308
+ rememberMe: this.isKeepLogin,
308
309
  ...(currentChallenge && {
309
310
  challengeId: currentChallenge.id,
310
311
  challengeResponse: this.challengeResponse(),
@@ -393,6 +394,10 @@ class AXPLoginPasswordComponent {
393
394
  if (errorCode === 'AccountLocked') {
394
395
  errorMsg = await this.formatAccountLockedMessage(resolvedApiError);
395
396
  }
397
+ else if (errorCode === 'MAX_ACTIVE_DEVICE_SESSIONS' ||
398
+ resolvedApiError?.['message'] === 'MAX_ACTIVE_DEVICE_SESSIONS') {
399
+ errorMsg = await this.translateService.translateAsync('@auth:signin.errors.max-active-device-sessions');
400
+ }
396
401
  else if (resolvedApiError?.['message'] && typeof resolvedApiError['message'] === 'string') {
397
402
  errorMsg = resolvedApiError['message'];
398
403
  }
@@ -553,7 +558,7 @@ class AXPLoginPasswordComponent {
553
558
  this.destroyChallengeComponent();
554
559
  }
555
560
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPLoginPasswordComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
556
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPLoginPasswordComponent, isStandalone: true, selector: "ng-component", viewQueries: [{ propertyName: "form", first: true, predicate: AXFormComponent, descendants: true }, { propertyName: "challengeContainerRef", first: true, predicate: ["challengeContainer"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: "<ng-container *translate=\"let t\">\n <div class=\"axp-auth-form\">\n <div class=\"text-center mb-3 lg:mb-5\">\n <h1 class=\"font-bold text-xl mb-1 lg:mb-2\">\n {{ '@auth:signin.title' | translate | async }}\n </h1>\n <p class=\"text-base text-neutral-600\">\n {{ '@auth:signin.hint' | translate | async }}\n </p>\n </div>\n <ax-form>\n <div class=\"flex flex-col gap-4 lg:gap-6\">\n <ax-form-field>\n <ax-label>{{ ('@auth:' + l1) | translate | async }}</ax-label>\n <ax-text-box\n [name]=\"'username'\"\n id=\"username\"\n [autoComplete]=\"'username'\"\n [(value)]=\"v1\"\n >\n <ax-validation-rule rule=\"required\"></ax-validation-rule>\n </ax-text-box>\n </ax-form-field>\n <ax-form-field>\n <ax-label>{{ '@auth:password' | translate | async }}</ax-label>\n <ax-password-box\n [name]=\"'password'\"\n id=\"password\"\n [autoComplete]=\"'current-password'\"\n [(value)]=\"v2\"\n >\n <ax-validation-rule rule=\"required\"></ax-validation-rule>\n </ax-password-box>\n </ax-form-field>\n\n <!-- Challenge Section (CAPTCHA) - rendered via ViewContainerRef -->\n @if (hasChallengeActive) {\n <ng-container #challengeContainer></ng-container>\n }\n\n <div class=\"flex justify-between items-center\">\n <ax-check-box [(ngModel)]=\"isKeepLogin\">\n <ax-label class=\"mb-0\">{{\n '@auth:signin.remember' | translate | async\n }}</ax-label>\n </ax-check-box>\n <ax-button\n color=\"primary\"\n class=\"ax-sm\"\n id=\"forgot-password\"\n [text]=\"'@auth:forgot.password' | translate | async\"\n look=\"blank\"\n (onClick)=\"handleForgotOnClick()\"\n >\n </ax-button>\n </div>\n </div>\n <ax-button\n color=\"primary\"\n class=\"mt-4 lg:mt-6 w-full\"\n id=\"submit-login\"\n [text]=\"'@auth:signin.submit' | translate | async\"\n (onClick)=\"handleLoginClick()\"\n [disabled]=\"isLoading$ | async\"\n [type]=\"'submit'\"\n >\n @if (isLoading$ | async) {\n <ax-loading></ax-loading>\n }\n </ax-button>\n @if (externalProviders.hasContent() || signupEnabled) {\n <div class=\"my-5 lg:my-8 flex w-full items-center\">\n <div class=\"h-px flex-1 bg-border-lighter\"></div>\n <span class=\"px-3 text-xs font-medium tracking-wide text-neutral-400\">\n {{ '@auth:signin.or' | translate | async }}\n </span>\n <div class=\"h-px flex-1 bg-border-lighter\"></div>\n </div>\n }\n <axm-login-external-providers\n #externalProviders\n ></axm-login-external-providers>\n </ax-form>\n @if (signupEnabled) {\n <ax-button\n class=\"w-full mt-2\"\n id=\"register\"\n (onClick)=\"handleRegisterOnClick()\"\n text=\"{{ '@auth:register' | translate | async }}\"\n [color]=\"'default'\"\n >\n </ax-button>\n }\n </div>\n</ng-container>\n", styles: [":host{display:block;width:100%}.axp-auth-form{width:100%;margin-inline:auto}@media(min-width:768px){.axp-auth-form{width:24rem;max-width:100%}}.axp-auth-form ax-form,.axp-auth-form ax-form-field,.axp-auth-form ax-text-box,.axp-auth-form ax-password-box{display:block;width:100%}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\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: AXFormModule }, { kind: "component", type: i1$1.AXFormFieldComponent, selector: "ax-form-field", inputs: ["labelMode"] }, { kind: "component", type: i1$1.AXFormComponent, selector: "ax-form", inputs: ["disabled", "readonly", "labelMode", "look", "messageStyle", "updateOn", "inUserInteractionActive"], outputs: ["onValidate", "updateOnChange"] }, { kind: "directive", type: i1$1.AXValidationRuleDirective, selector: "ax-validation-rule", inputs: ["rule", "options", "message", "disabled"] }, { kind: "ngmodule", type: AXTextBoxModule }, { kind: "component", type: i2.AXTextBoxComponent, selector: "ax-text-box", inputs: ["disabled", "tabIndex", "readonly", "value", "state", "name", "id", "placeholder", "maxLength", "allowNull", "type", "autoComplete", "look", "maskPattern", "customTokens", "class"], outputs: ["onBlur", "onFocus", "valueChange", "stateChange", "onValueChanged", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress", "onMaskChanged"] }, { kind: "ngmodule", type: AXPasswordBoxModule }, { kind: "component", type: i4.AXPasswordBoxComponent, selector: "ax-password-box", inputs: ["readonly", "disabled", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "autoComplete", "showToggleButton", "class"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXLabelModule }, { kind: "component", type: i3.AXLabelComponent, selector: "ax-label", inputs: ["required", "for"], outputs: ["requiredChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "ngmodule", type: AXCheckBoxModule }, { kind: "component", type: i7.AXCheckBoxComponent, selector: "ax-check-box", inputs: ["disabled", "tabIndex", "readonly", "color", "value", "name", "id", "isLoading", "indeterminate"], outputs: ["onBlur", "onFocus", "valueChange", "onValueChanged"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "directive", type: i5.AXTranslatorDirective, selector: "[translate]" }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "component", type: i2$1.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: RouterModule }, { kind: "ngmodule", type: AXValidationModule }, { kind: "component", type: AXPLoginExternalProvidersComponent, selector: "axm-login-external-providers" }, { kind: "pipe", type: i3$2.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
561
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPLoginPasswordComponent, isStandalone: true, selector: "ng-component", viewQueries: [{ propertyName: "form", first: true, predicate: AXFormComponent, descendants: true }, { propertyName: "challengeContainerRef", first: true, predicate: ["challengeContainer"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: "<ng-container *translate=\"let t\">\n <div class=\"axp-auth-form\">\n <div class=\"text-center mb-3 lg:mb-5\">\n <h1 class=\"font-bold text-xl mb-1 lg:mb-2\">\n {{ '@auth:signin.title' | translate | async }}\n </h1>\n <p class=\"text-base text-neutral-600\">\n {{ '@auth:signin.hint' | translate | async }}\n </p>\n </div>\n <ax-form>\n <div class=\"flex flex-col gap-4 lg:gap-6\">\n <ax-form-field>\n <ax-label>{{ ('@auth:' + l1) | translate | async }}</ax-label>\n <ax-text-box\n [name]=\"'username'\"\n id=\"username\"\n [autoComplete]=\"'username'\"\n [(value)]=\"v1\"\n >\n <ax-validation-rule rule=\"required\"></ax-validation-rule>\n </ax-text-box>\n </ax-form-field>\n <ax-form-field>\n <ax-label>{{ '@auth:password' | translate | async }}</ax-label>\n <ax-password-box\n [name]=\"'password'\"\n id=\"password\"\n [autoComplete]=\"'current-password'\"\n [(value)]=\"v2\"\n >\n <ax-validation-rule rule=\"required\"></ax-validation-rule>\n </ax-password-box>\n </ax-form-field>\n\n <!-- Challenge Section (CAPTCHA) - rendered via ViewContainerRef -->\n @if (hasChallengeActive) {\n <ng-container #challengeContainer></ng-container>\n }\n\n <div class=\"flex justify-between items-center\">\n <ax-check-box [(ngModel)]=\"isKeepLogin\">\n <ax-label class=\"mb-0\">{{\n '@auth:signin.remember' | translate | async\n }}</ax-label>\n </ax-check-box>\n <ax-button\n color=\"primary\"\n class=\"ax-sm\"\n id=\"forgot-password\"\n [text]=\"'@auth:forgot.password' | translate | async\"\n look=\"blank\"\n (onClick)=\"handleForgotOnClick()\"\n >\n </ax-button>\n </div>\n </div>\n <ax-button\n color=\"primary\"\n class=\"mt-4 lg:mt-6 w-full\"\n id=\"submit-login\"\n [text]=\"'@auth:signin.submit' | translate | async\"\n (onClick)=\"handleLoginClick()\"\n [disabled]=\"isLoading$ | async\"\n [type]=\"'submit'\"\n >\n @if (isLoading$ | async) {\n <ax-loading></ax-loading>\n }\n </ax-button>\n @if (externalProviders.hasContent() || signupEnabled) {\n <div class=\"my-5 lg:my-8 flex w-full items-center\">\n <div class=\"h-px flex-1 bg-border-lighter\"></div>\n <span class=\"px-3 text-xs font-medium tracking-wide text-neutral-400\">\n {{ '@auth:signin.or' | translate | async }}\n </span>\n <div class=\"h-px flex-1 bg-border-lighter\"></div>\n </div>\n }\n <axm-login-external-providers\n #externalProviders\n ></axm-login-external-providers>\n </ax-form>\n @if (signupEnabled) {\n <ax-button\n class=\"w-full mt-2\"\n id=\"register\"\n (onClick)=\"handleRegisterOnClick()\"\n text=\"{{ '@auth:register' | translate | async }}\"\n [color]=\"'default'\"\n >\n </ax-button>\n }\n </div>\n</ng-container>\n", styles: [":host{display:block;width:100%}.axp-auth-form{width:100%;margin-inline:auto}@media(min-width:768px){.axp-auth-form{width:24rem;max-width:100%}}.axp-auth-form ax-form,.axp-auth-form ax-form-field,.axp-auth-form ax-text-box,.axp-auth-form ax-password-box{display:block;width:100%}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\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: AXFormModule }, { kind: "component", type: i1$1.AXFormFieldComponent, selector: "ax-form-field", inputs: ["labelMode"] }, { kind: "component", type: i1$1.AXFormComponent, selector: "ax-form", inputs: ["disabled", "readonly", "labelMode", "look", "messageStyle", "updateOn", "inUserInteractionActive"], outputs: ["onValidate", "updateOnChange"] }, { kind: "directive", type: i1$1.AXValidationRuleDirective, selector: "ax-validation-rule", inputs: ["rule", "options", "message", "disabled"] }, { kind: "ngmodule", type: AXTextBoxModule }, { kind: "component", type: i2.AXTextBoxComponent, selector: "ax-text-box", inputs: ["disabled", "tabIndex", "readonly", "value", "state", "name", "id", "placeholder", "maxLength", "allowNull", "type", "autoComplete", "look", "maskPattern", "customTokens", "class"], outputs: ["onBlur", "onFocus", "valueChange", "stateChange", "onValueChanged", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress", "onMaskChanged"] }, { kind: "ngmodule", type: AXPasswordBoxModule }, { kind: "component", type: i4.AXPasswordBoxComponent, selector: "ax-password-box", inputs: ["readonly", "disabled", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "autoComplete", "showToggleButton", "class"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.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: AXLabelModule }, { kind: "component", type: i3.AXLabelComponent, selector: "ax-label", inputs: ["required", "for"], outputs: ["requiredChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "ngmodule", type: AXCheckBoxModule }, { kind: "component", type: i7.AXCheckBoxComponent, selector: "ax-check-box", inputs: ["disabled", "tabIndex", "readonly", "color", "value", "name", "id", "isLoading", "indeterminate"], outputs: ["onBlur", "onFocus", "valueChange", "onValueChanged"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "directive", type: i5.AXTranslatorDirective, selector: "[translate]" }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "component", type: i2$1.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: RouterModule }, { kind: "ngmodule", type: AXValidationModule }, { kind: "component", type: AXPLoginExternalProvidersComponent, selector: "axm-login-external-providers" }, { kind: "pipe", type: i5$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
557
562
  }
558
563
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPLoginPasswordComponent, decorators: [{
559
564
  type: Component,
@@ -567,4 +572,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
567
572
  }] } });
568
573
 
569
574
  export { AXPLoginPasswordComponent };
570
- //# sourceMappingURL=acorex-platform-module-auth-client-password.component-D5QDAaKY.mjs.map
575
+ //# sourceMappingURL=acorex-platform-module-auth-client-password.component-BoWDVby5.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acorex-platform-module-auth-client-password.component-BoWDVby5.mjs","sources":["../../../../libs/modules/auth/client/src/lib/pages/login/password/default-challenge.component.ts","../../../../libs/modules/auth/client/src/lib/pages/login/password/password.component.ts","../../../../libs/modules/auth/client/src/lib/pages/login/password/password.component.html"],"sourcesContent":["import { AXButtonModule } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXFormModule } from '@acorex/components/form';\nimport { AXLabelModule } from '@acorex/components/label';\nimport { AXLoadingModule } from '@acorex/components/loading';\nimport { AXTextBoxModule } from '@acorex/components/text-box';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { AXValidationModule } from '@acorex/core/validation';\nimport { AXPLoginChallengeComponentBase } from '@acorex-platform/framework-client/auth';\nimport { CommonModule } from '@angular/common';\nimport { Component, signal, ChangeDetectionStrategy } from '@angular/core';\n\n//#region ---- Default Challenge Component ----\n\n/**\n * Default built-in challenge component for login\n * Shows challenge image/content with an input field and refresh button\n */\n@Component({\n selector: 'axp-default-challenge',\n standalone: true,\n imports: [\n AXButtonModule,\n AXTextBoxModule,\n AXLabelModule,\n AXFormModule,\n AXDecoratorModule,\n AXLoadingModule,\n AXTranslationModule,\n AXValidationModule,\n CommonModule,\n ],\n changeDetection: ChangeDetectionStrategy.Eager,\n template: `\n <div class=\"flex flex-col gap-3 p-4 border rounded-md border-warning-300 bg-warning-50\">\n <!-- Challenge Image -->\n <div class=\"flex items-center justify-center gap-2\">\n @if (challengeData(); as challenge) {\n @if (challenge.contentType === 'image-base64') {\n <img\n [src]=\"'data:image/png;base64,' + challenge.content\"\n alt=\"Security Challenge\"\n class=\"h-12 border rounded\"\n />\n } @else if (challenge.contentType === 'image-url') {\n <img [src]=\"challenge.content\" alt=\"Security Challenge\" class=\"h-12 border rounded\" />\n } @else {\n <span class=\"font-mono text-lg p-2 border rounded bg-white\">\n {{ challenge.content }}\n </span>\n }\n }\n <!-- Refresh Challenge Button -->\n <ax-button\n look=\"blank\"\n color=\"primary\"\n class=\"ax-sm\"\n id=\"refresh-challenge\"\n (onClick)=\"onRefreshClick()\"\n [disabled]=\"isLoading()\"\n >\n @if (isLoading()) {\n <ax-loading></ax-loading>\n } @else {\n <ax-icon><i class=\"fa-solid fa-rotate\"></i></ax-icon>\n }\n </ax-button>\n </div>\n\n <!-- Challenge Response Input -->\n <ax-form-field>\n <ax-label>{{ '@auth:challenge.enter-code' | translate | async }}</ax-label>\n <ax-text-box\n [name]=\"'challengeResponse'\"\n id=\"challenge-response\"\n [placeholder]=\"'@auth:challenge.placeholder' | translate | async\"\n [value]=\"response()\"\n (valueChange)=\"onResponseChange($event)\"\n >\n <ax-validation-rule rule=\"required\"></ax-validation-rule>\n </ax-text-box>\n </ax-form-field>\n </div>\n `,\n})\nexport class AXPDefaultChallengeComponent extends AXPLoginChallengeComponentBase {\n //#region ---- Local State ----\n\n /** Local state for the response input */\n protected response = signal<string>('');\n\n //#endregion\n\n //#region ---- Event Handlers ----\n\n /**\n * Handles response input change\n */\n protected onResponseChange(value: string): void {\n this.response.set(value);\n this.responseChange.emit(value);\n }\n\n /**\n * Handles refresh button click\n */\n protected onRefreshClick(): void {\n this.refreshRequest.emit();\n }\n\n //#endregion\n}\n\n//#endregion\n","import { AXButtonModule } from '@acorex/components/button';\nimport { AXCheckBoxModule } from '@acorex/components/check-box';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXFormComponent, AXFormModule } from '@acorex/components/form';\nimport { AXLabelModule } from '@acorex/components/label';\nimport { AXLoadingModule } from '@acorex/components/loading';\nimport { AXPasswordBoxModule } from '@acorex/components/password-box';\nimport { AXTextBoxModule } from '@acorex/components/text-box';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport {\n Component,\n ComponentRef,\n Injector,\n OnInit,\n Type,\n ViewChild,\n ViewContainerRef,\n effect,\n inject,\n signal,\n ChangeDetectionStrategy\n} from '@angular/core';\nimport { ActivatedRoute, Router, RouterModule } from '@angular/router';\n\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXFormatService } from '@acorex/core/format';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { AXValidationModule } from '@acorex/core/validation';\nimport {\n AXPLoginChallengeComponentBase,\n AXPLoginChallengeData,\n AXPSessionService,\n AXP_LOGIN_CHALLENGE_PROVIDER,\n} from '@acorex-platform/framework-client/auth';\nimport { AXPHomePageService, AXPSettingsService } from '@acorex-platform/framework-client/common';\nimport { AXPRegionalSetting } from '@acorex-platform/framework-shared/core';\nimport { FormsModule } from '@angular/forms';\nimport { BehaviorSubject, firstValueFrom } from 'rxjs';\nimport { AXMAuthenticationTypes } from '../../../auth.config';\nimport { AXMAuthPlatformSettingsService } from '../../../auth-platform-settings.service';\nimport { AXPLoginExternalProvidersComponent } from '../login-external-providers.component';\nimport { AXPDefaultChallengeComponent } from './default-challenge.component';\n\n//#region ---- Module Imports ----\n\nconst MODULES = [\n CommonModule,\n FormsModule,\n AXFormModule,\n AXTextBoxModule,\n AXPasswordBoxModule,\n AXButtonModule,\n AXLabelModule,\n AXDecoratorModule,\n AXCheckBoxModule,\n AXTranslationModule,\n AXLoadingModule,\n RouterModule,\n AXValidationModule,\n AXPLoginExternalProvidersComponent,\n];\n\n//#endregion\n\n@Component({\n templateUrl: './password.component.html',\n styleUrls: ['./password.component.css'],\n changeDetection: ChangeDetectionStrategy.Eager,\n imports: [...MODULES],\n})\nexport class AXPLoginPasswordComponent implements OnInit {\n //#region ---- Services & Dependencies ----\n\n private readonly authPlatformSettings = inject(AXMAuthPlatformSettingsService);\n private sessionService = inject(AXPSessionService);\n private activateRoute = inject(ActivatedRoute);\n private homePageService = inject(AXPHomePageService);\n private toastService = inject(AXToastService);\n private formatService = inject(AXFormatService);\n private settingsService = inject(AXPSettingsService);\n private translateService = inject(AXTranslationService);\n private router = inject(Router);\n protected injector = inject(Injector);\n\n protected readonly signupEnabled = this.authPlatformSettings.signupEnabled();\n\n /** Optional challenge provider - injected only if configured */\n private challengeProvider = inject(AXP_LOGIN_CHALLENGE_PROVIDER, { optional: true });\n\n //#endregion\n\n //#region ---- Form References ----\n\n @ViewChild(AXFormComponent)\n private form!: AXFormComponent;\n\n //#endregion\n\n //#region ---- Form Fields ----\n\n /** Label key for the first input field (username/email/mobile) */\n protected l1!: string;\n\n /** Label key for the second input field (password) */\n protected l2!: string;\n\n /** Value of the first input field (username/email) */\n protected v1 = '';\n\n /** Value of the second input field (password) */\n protected v2: string | null = '';\n\n /** Whether to keep the user logged in */\n protected isKeepLogin = false;\n\n //#endregion\n\n //#region ---- Challenge State ----\n\n /** ViewContainerRef for rendering the challenge component */\n @ViewChild('challengeContainer', { read: ViewContainerRef })\n private challengeContainerRef?: ViewContainerRef;\n\n /** Reference to the currently rendered challenge component */\n private challengeComponentRef?: ComponentRef<AXPLoginChallengeComponentBase>;\n\n /** Current challenge data from the server */\n protected challengeData = signal<AXPLoginChallengeData | null>(null);\n\n /** User's response to the challenge (e.g., CAPTCHA text) */\n protected challengeResponse = signal<string>('');\n\n /** Loading state for challenge refresh */\n protected isChallengeLoading = signal<boolean>(false);\n\n /**\n * Effect to render the challenge component when challenge data changes\n */\n private challengeRenderEffect = effect(() => {\n const data = this.challengeData();\n const isLoading = this.isChallengeLoading();\n\n // Wait for next tick to ensure ViewContainerRef is available\n setTimeout(() => {\n if (data && this.challengeContainerRef) {\n this.renderChallengeComponent(data, isLoading);\n } else {\n this.destroyChallengeComponent();\n }\n });\n });\n\n //#endregion\n\n //#region ---- Loading & Status State ----\n\n protected isLoading$: BehaviorSubject<boolean> = new BehaviorSubject(false);\n protected submitText = 'signin.submit';\n\n //#endregion\n\n //#region ---- Computed Properties ----\n\n /** Check if a challenge is currently active and should be displayed */\n protected get hasChallengeActive(): boolean {\n return this.challengeData() !== null;\n }\n\n //#endregion\n\n //#region ---- Lifecycle Methods ----\n\n ngOnInit(): void {\n this.l2 = 'password';\n switch (this.authPlatformSettings.credentialType()) {\n case AXMAuthenticationTypes.EmailPassword:\n this.l1 = 'email';\n break;\n case AXMAuthenticationTypes.MobilePassword:\n this.l1 = 'mobile';\n break;\n case AXMAuthenticationTypes.UsernameEmailPassword:\n this.l1 = 'username-email';\n break;\n case AXMAuthenticationTypes.UsernamePassword:\n default:\n this.l1 = 'username';\n }\n }\n\n //#endregion\n\n //#region ---- Navigation Handlers ----\n\n protected handleForgotOnClick(): void {\n this.router.navigate(['/auth/forgot']);\n }\n\n protected handleRegisterOnClick(): void {\n this.router.navigate([this.authPlatformSettings.signupUrl()]);\n }\n\n //#endregion\n\n //#region ---- Login Handlers ----\n\n protected handleLoginClick(): void {\n const strategyName = this.authPlatformSettings.defaultStrategyName();\n this.sessionService.setStrategy(strategyName);\n const redirectUrl = this.activateRoute.snapshot.queryParams['redirectUrl'];\n\n this.form.validate().then(async (form) => {\n if (form.result) {\n this.isLoading$.next(true);\n this.submitText = 'processing';\n\n try {\n // Build credentials object with challenge data if active\n const currentChallenge = this.challengeData();\n const credentials = {\n strategy: strategyName,\n username: this.v1,\n password: this.v2!,\n rememberMe: this.isKeepLogin,\n ...(currentChallenge && {\n challengeId: currentChallenge.id,\n challengeResponse: this.challengeResponse(),\n }),\n };\n\n await this.sessionService.signin(credentials);\n\n // Check authentication status before navigation\n const isAuthenticated = await firstValueFrom(this.sessionService.isAuthenticated$);\n\n if (!isAuthenticated) {\n throw new Error('Authentication failed after signin');\n }\n\n // Clear challenge state on successful login\n this.clearChallengeState();\n\n await this.navigateAfterAuth(redirectUrl);\n } catch (error: unknown) {\n await this.handleLoginError(error);\n } finally {\n // Always unlock the button — success navigates away; failure must not stay \"processing\".\n this.submitText = 'signin.submit';\n this.isLoading$.next(false);\n }\n }\n });\n }\n\n private async navigateAfterAuth(redirectUrl?: string): Promise<void> {\n if (this.sessionService.tenant?.id == null) {\n await this.router.navigate(['/auth/account/tenant-chooser']);\n return;\n }\n\n if (this.sessionService.application?.id == null) {\n await this.router.navigate(['/auth/account/app-chooser']);\n return;\n }\n\n if (redirectUrl) {\n await this.router.navigate([redirectUrl]);\n return;\n }\n\n await this.homePageService.navigateTo();\n }\n\n /**\n * Handles login errors and checks if a challenge is required\n */\n private async handleLoginError(error: unknown): Promise<void> {\n const apiError = this.extractApiError(error);\n\n // Check if challenge provider wants to handle this error\n if (this.challengeProvider) {\n const checkResult = this.challengeProvider.checkResponse(error);\n\n if (checkResult?.required) {\n try {\n // Fetch challenge from server\n const challenge = await this.challengeProvider.getChallenge(checkResult.serverData);\n this.challengeData.set(challenge);\n this.challengeResponse.set('');\n\n // Show challenge message if provided\n if (checkResult.message) {\n this.toastService.show({\n color: 'warning',\n content: checkResult.message,\n timeOut: 5000,\n });\n }\n\n this.submitText = 'signin.submit';\n this.isLoading$.next(false);\n return;\n } catch (challengeError) {\n console.error('Failed to fetch challenge:', challengeError);\n }\n }\n }\n\n // Default error handling (do not add a second toast for requiresCaptcha —\n // that flag is for challenge UI; without a provider it duplicated the error toast)\n await this.showLoginError(error, apiError);\n }\n\n /**\n * Displays the login error message to the user\n */\n private async showLoginError(error: unknown, apiError?: Record<string, unknown> | null): Promise<void> {\n let errorMsg = 'An error occurred during sign in.';\n const resolvedApiError = apiError ?? this.extractApiError(error);\n const errorCode =\n (typeof resolvedApiError?.['error'] === 'string' && resolvedApiError['error']) ||\n (typeof resolvedApiError?.['code'] === 'string' && resolvedApiError['code']) ||\n '';\n\n if (errorCode === 'AccountLocked') {\n errorMsg = await this.formatAccountLockedMessage(resolvedApiError);\n } else if (\n errorCode === 'MAX_ACTIVE_DEVICE_SESSIONS' ||\n resolvedApiError?.['message'] === 'MAX_ACTIVE_DEVICE_SESSIONS'\n ) {\n errorMsg = await this.translateService.translateAsync(\n '@auth:signin.errors.max-active-device-sessions',\n );\n } else if (resolvedApiError?.['message'] && typeof resolvedApiError['message'] === 'string') {\n errorMsg = resolvedApiError['message'];\n } else if (error && typeof error === 'object') {\n const err = error as Record<string, unknown>;\n const errObj = err['error'] as Record<string, unknown> | undefined;\n\n errorMsg =\n (errObj?.['error_description'] as string) ||\n (errObj?.['error'] as string) ||\n (err['message'] as string) ||\n errorMsg;\n\n if (typeof errorMsg === 'object') {\n const msgObj = errorMsg as unknown as Record<string, unknown>;\n errorMsg = (msgObj['message'] as string) || (msgObj['error_description'] as string) || JSON.stringify(errorMsg);\n }\n }\n\n const remainingAttempts = resolvedApiError?.['remainingAttempts'];\n if (typeof remainingAttempts === 'number' && remainingAttempts >= 0 && errorCode !== 'AccountLocked') {\n errorMsg = `${errorMsg} (${remainingAttempts} attempt${remainingAttempts === 1 ? '' : 's'} remaining)`;\n }\n\n this.toastService.show({\n color: 'danger',\n content: errorMsg,\n timeOut: 5000,\n });\n\n console.error('Login error:', error);\n this.submitText = 'signin.submit';\n this.v2 = null;\n this.isLoading$.next(false);\n }\n\n private extractApiError(error: unknown): Record<string, unknown> | null {\n if (!error || typeof error !== 'object') {\n return null;\n }\n\n const err = error as Record<string, unknown>;\n if (err['apiError'] && typeof err['apiError'] === 'object') {\n return err['apiError'] as Record<string, unknown>;\n }\n\n // AuthApiError exposes captcha/lockout fields on `.apiError`.\n if ('apiError' in err && err['apiError'] == null && typeof err['message'] === 'string') {\n return { message: err['message'] };\n }\n\n if (err['error'] && typeof err['error'] === 'object') {\n return err['error'] as Record<string, unknown>;\n }\n\n return null;\n }\n\n private async formatAccountLockedMessage(apiError: Record<string, unknown> | null): Promise<string> {\n const details =\n apiError?.['details'] && typeof apiError['details'] === 'object'\n ? (apiError['details'] as Record<string, unknown>)\n : null;\n const lockedUntil =\n (typeof apiError?.['lockedUntil'] === 'string' && apiError['lockedUntil']) ||\n (typeof details?.['lockedUntil'] === 'string' && details['lockedUntil']) ||\n '';\n const formatted = lockedUntil ? await this.formatLockedUntil(lockedUntil) : '';\n\n if (formatted) {\n return this.translateService.translateAsync('@auth:signin.errors.account-locked-until', {\n params: { datetime: formatted },\n });\n }\n\n return this.translateService.translateAsync('@auth:signin.errors.account-locked');\n }\n\n private async formatLockedUntil(iso: string): Promise<string> {\n const parsed = Date.parse(iso);\n if (!Number.isFinite(parsed)) {\n return '';\n }\n\n const dateFormat = await this.settingsService.get(AXPRegionalSetting.ShortDate);\n const timeFormat = await this.settingsService.get(AXPRegionalSetting.ShortTime);\n const format = `${dateFormat} ${timeFormat}`.trim();\n return this.formatService.format(new Date(parsed), 'datetime', { format });\n }\n\n //#endregion\n\n //#region ---- Challenge Handlers ----\n\n /**\n * Gets the challenge component type from provider or uses default\n */\n private getChallengeComponentType(): Type<AXPLoginChallengeComponentBase> {\n return this.challengeProvider?.getChallengeComponent() ?? AXPDefaultChallengeComponent;\n }\n\n /**\n * Renders the challenge component dynamically\n */\n private renderChallengeComponent(data: AXPLoginChallengeData, isLoading: boolean): void {\n if (!this.challengeContainerRef) return;\n\n // If component already exists, just update inputs\n if (this.challengeComponentRef) {\n this.updateChallengeComponentInputs(data, isLoading);\n return;\n }\n\n // Clear container and create new component\n this.challengeContainerRef.clear();\n const componentType = this.getChallengeComponentType();\n this.challengeComponentRef = this.challengeContainerRef.createComponent(componentType);\n\n // Set inputs\n this.updateChallengeComponentInputs(data, isLoading);\n\n // Subscribe to outputs\n const instance = this.challengeComponentRef.instance;\n instance.responseChange.subscribe((response: string) => {\n this.challengeResponse.set(response);\n });\n instance.refreshRequest.subscribe(() => {\n this.handleRefreshChallenge();\n });\n }\n\n /**\n * Updates the inputs of the challenge component\n */\n private updateChallengeComponentInputs(data: AXPLoginChallengeData, isLoading: boolean): void {\n if (!this.challengeComponentRef) return;\n\n this.challengeComponentRef.setInput('challengeData', data);\n this.challengeComponentRef.setInput('isLoading', isLoading);\n }\n\n /**\n * Destroys the challenge component\n */\n private destroyChallengeComponent(): void {\n if (this.challengeComponentRef) {\n this.challengeComponentRef.destroy();\n this.challengeComponentRef = undefined;\n }\n if (this.challengeContainerRef) {\n this.challengeContainerRef.clear();\n }\n }\n\n /**\n * Refreshes the challenge (e.g., user clicks \"new image\" button)\n */\n protected async handleRefreshChallenge(): Promise<void> {\n if (!this.challengeProvider) return;\n\n this.isChallengeLoading.set(true);\n try {\n const newChallenge = await this.challengeProvider.refreshChallenge();\n this.challengeData.set(newChallenge);\n this.challengeResponse.set('');\n } catch (error) {\n console.error('Failed to refresh challenge:', error);\n this.toastService.show({\n color: 'danger',\n content: 'Failed to load new challenge. Please try again.',\n timeOut: 3000,\n });\n } finally {\n this.isChallengeLoading.set(false);\n }\n }\n\n /**\n * Clears the challenge state (after successful login or manual clear)\n */\n private clearChallengeState(): void {\n this.challengeData.set(null);\n this.challengeResponse.set('');\n this.destroyChallengeComponent();\n }\n\n //#endregion\n}\n","<ng-container *translate=\"let t\">\n <div class=\"axp-auth-form\">\n <div class=\"text-center mb-3 lg:mb-5\">\n <h1 class=\"font-bold text-xl mb-1 lg:mb-2\">\n {{ '@auth:signin.title' | translate | async }}\n </h1>\n <p class=\"text-base text-neutral-600\">\n {{ '@auth:signin.hint' | translate | async }}\n </p>\n </div>\n <ax-form>\n <div class=\"flex flex-col gap-4 lg:gap-6\">\n <ax-form-field>\n <ax-label>{{ ('@auth:' + l1) | translate | async }}</ax-label>\n <ax-text-box\n [name]=\"'username'\"\n id=\"username\"\n [autoComplete]=\"'username'\"\n [(value)]=\"v1\"\n >\n <ax-validation-rule rule=\"required\"></ax-validation-rule>\n </ax-text-box>\n </ax-form-field>\n <ax-form-field>\n <ax-label>{{ '@auth:password' | translate | async }}</ax-label>\n <ax-password-box\n [name]=\"'password'\"\n id=\"password\"\n [autoComplete]=\"'current-password'\"\n [(value)]=\"v2\"\n >\n <ax-validation-rule rule=\"required\"></ax-validation-rule>\n </ax-password-box>\n </ax-form-field>\n\n <!-- Challenge Section (CAPTCHA) - rendered via ViewContainerRef -->\n @if (hasChallengeActive) {\n <ng-container #challengeContainer></ng-container>\n }\n\n <div class=\"flex justify-between items-center\">\n <ax-check-box [(ngModel)]=\"isKeepLogin\">\n <ax-label class=\"mb-0\">{{\n '@auth:signin.remember' | translate | async\n }}</ax-label>\n </ax-check-box>\n <ax-button\n color=\"primary\"\n class=\"ax-sm\"\n id=\"forgot-password\"\n [text]=\"'@auth:forgot.password' | translate | async\"\n look=\"blank\"\n (onClick)=\"handleForgotOnClick()\"\n >\n </ax-button>\n </div>\n </div>\n <ax-button\n color=\"primary\"\n class=\"mt-4 lg:mt-6 w-full\"\n id=\"submit-login\"\n [text]=\"'@auth:signin.submit' | translate | async\"\n (onClick)=\"handleLoginClick()\"\n [disabled]=\"isLoading$ | async\"\n [type]=\"'submit'\"\n >\n @if (isLoading$ | async) {\n <ax-loading></ax-loading>\n }\n </ax-button>\n @if (externalProviders.hasContent() || signupEnabled) {\n <div class=\"my-5 lg:my-8 flex w-full items-center\">\n <div class=\"h-px flex-1 bg-border-lighter\"></div>\n <span class=\"px-3 text-xs font-medium tracking-wide text-neutral-400\">\n {{ '@auth:signin.or' | translate | async }}\n </span>\n <div class=\"h-px flex-1 bg-border-lighter\"></div>\n </div>\n }\n <axm-login-external-providers\n #externalProviders\n ></axm-login-external-providers>\n </ax-form>\n @if (signupEnabled) {\n <ax-button\n class=\"w-full mt-2\"\n id=\"register\"\n (onClick)=\"handleRegisterOnClick()\"\n text=\"{{ '@auth:register' | translate | async }}\"\n [color]=\"'default'\"\n >\n </ax-button>\n }\n </div>\n</ng-container>\n"],"names":["i4","i5","i6","i7","i8","i1","i2","i3","i9","i10"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYA;AAEA;;;AAGG;AAoEG,MAAO,4BAA6B,SAAQ,8BAA8B,CAAA;AAnEhF,IAAA,WAAA,GAAA;;;;QAuEY,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAS,EAAE;qFAAC;AAsBxC,IAAA;;;AAhBC;;AAEG;AACO,IAAA,gBAAgB,CAAC,KAAa,EAAA;AACtC,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;AACxB,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC;IACjC;AAEA;;AAEG;IACO,cAAc,GAAA;AACtB,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE;IAC5B;8GAvBW,4BAA4B,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA5B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,4BAA4B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EApD7B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkDT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EA7DC,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAAA,OAAA,EAAA,MAAA,EAAA,MAAA,EAAA,YAAA,EAAA,UAAA,EAAA,UAAA,EAAA,MAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,YAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,OAAA,EAAA,OAAA,EAAA,MAAA,EAAA,IAAA,EAAA,aAAA,EAAA,WAAA,EAAA,WAAA,EAAA,MAAA,EAAA,cAAA,EAAA,MAAA,EAAA,aAAA,EAAA,cAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,SAAA,EAAA,aAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,SAAA,EAAA,YAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,aAAa,gKACb,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,iBAAiB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,wBAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACjB,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,MAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACnB,kBAAkB,8BAClB,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,KAAA,EAAA,CAAA,CAAA;;2FAuDH,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBAnExC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,uBAAuB;AACjC,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,OAAO,EAAE;wBACP,cAAc;wBACd,eAAe;wBACf,aAAa;wBACb,YAAY;wBACZ,iBAAiB;wBACjB,eAAe;wBACf,mBAAmB;wBACnB,kBAAkB;wBAClB,YAAY;AACb,qBAAA;oBACD,eAAe,EAAE,uBAAuB,CAAC,KAAK;AAC9C,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkDT,EAAA,CAAA;AACF,iBAAA;;;ACxCD;AAEA,MAAM,OAAO,GAAG;IACd,YAAY;IACZ,WAAW;IACX,YAAY;IACZ,eAAe;IACf,mBAAmB;IACnB,cAAc;IACd,aAAa;IACb,iBAAiB;IACjB,gBAAgB;IAChB,mBAAmB;IACnB,eAAe;IACf,YAAY;IACZ,kBAAkB;IAClB,kCAAkC;CACnC;AAED;MAQa,yBAAyB,CAAA;AANtC,IAAA,WAAA,GAAA;;AASmB,QAAA,IAAA,CAAA,oBAAoB,GAAG,MAAM,CAAC,8BAA8B,CAAC;AACtE,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC1C,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,cAAc,CAAC;AACtC,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAC,kBAAkB,CAAC;AAC5C,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,cAAc,CAAC;AACrC,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,eAAe,CAAC;AACvC,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAC,kBAAkB,CAAC;AAC5C,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAC,oBAAoB,CAAC;AAC/C,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AACrB,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAElB,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,CAAC,oBAAoB,CAAC,aAAa,EAAE;;QAGpE,IAAA,CAAA,iBAAiB,GAAG,MAAM,CAAC,4BAA4B,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;QAoB1E,IAAA,CAAA,EAAE,GAAG,EAAE;;QAGP,IAAA,CAAA,EAAE,GAAkB,EAAE;;QAGtB,IAAA,CAAA,WAAW,GAAG,KAAK;;QAcnB,IAAA,CAAA,aAAa,GAAG,MAAM,CAA+B,IAAI;0FAAC;;QAG1D,IAAA,CAAA,iBAAiB,GAAG,MAAM,CAAS,EAAE;8FAAC;;QAGtC,IAAA,CAAA,kBAAkB,GAAG,MAAM,CAAU,KAAK;+FAAC;AAErD;;AAEG;AACK,QAAA,IAAA,CAAA,qBAAqB,GAAG,MAAM,CAAC,MAAK;AAC1C,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE;AACjC,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,EAAE;;YAG3C,UAAU,CAAC,MAAK;AACd,gBAAA,IAAI,IAAI,IAAI,IAAI,CAAC,qBAAqB,EAAE;AACtC,oBAAA,IAAI,CAAC,wBAAwB,CAAC,IAAI,EAAE,SAAS,CAAC;gBAChD;qBAAO;oBACL,IAAI,CAAC,yBAAyB,EAAE;gBAClC;AACF,YAAA,CAAC,CAAC;QACJ,CAAC;kGAAC;;;AAMQ,QAAA,IAAA,CAAA,UAAU,GAA6B,IAAI,eAAe,CAAC,KAAK,CAAC;QACjE,IAAA,CAAA,UAAU,GAAG,eAAe;AA0WvC,IAAA;;;;AAnWC,IAAA,IAAc,kBAAkB,GAAA;AAC9B,QAAA,OAAO,IAAI,CAAC,aAAa,EAAE,KAAK,IAAI;IACtC;;;IAMA,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,EAAE,GAAG,UAAU;AACpB,QAAA,QAAQ,IAAI,CAAC,oBAAoB,CAAC,cAAc,EAAE;YAChD,KAAK,sBAAsB,CAAC,aAAa;AACvC,gBAAA,IAAI,CAAC,EAAE,GAAG,OAAO;gBACjB;YACF,KAAK,sBAAsB,CAAC,cAAc;AACxC,gBAAA,IAAI,CAAC,EAAE,GAAG,QAAQ;gBAClB;YACF,KAAK,sBAAsB,CAAC,qBAAqB;AAC/C,gBAAA,IAAI,CAAC,EAAE,GAAG,gBAAgB;gBAC1B;YACF,KAAK,sBAAsB,CAAC,gBAAgB;AAC5C,YAAA;AACE,gBAAA,IAAI,CAAC,EAAE,GAAG,UAAU;;IAE1B;;;IAMU,mBAAmB,GAAA;QAC3B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,cAAc,CAAC,CAAC;IACxC;IAEU,qBAAqB,GAAA;AAC7B,QAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,CAAC,CAAC;IAC/D;;;IAMU,gBAAgB,GAAA;QACxB,MAAM,YAAY,GAAG,IAAI,CAAC,oBAAoB,CAAC,mBAAmB,EAAE;AACpE,QAAA,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,YAAY,CAAC;AAC7C,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,WAAW,CAAC,aAAa,CAAC;AAE1E,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,OAAO,IAAI,KAAI;AACvC,YAAA,IAAI,IAAI,CAAC,MAAM,EAAE;AACf,gBAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;AAC1B,gBAAA,IAAI,CAAC,UAAU,GAAG,YAAY;AAE9B,gBAAA,IAAI;;AAEF,oBAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,aAAa,EAAE;AAC7C,oBAAA,MAAM,WAAW,GAAG;AAClB,wBAAA,QAAQ,EAAE,YAAY;wBACtB,QAAQ,EAAE,IAAI,CAAC,EAAE;wBACjB,QAAQ,EAAE,IAAI,CAAC,EAAG;wBAClB,UAAU,EAAE,IAAI,CAAC,WAAW;wBAC5B,IAAI,gBAAgB,IAAI;4BACtB,WAAW,EAAE,gBAAgB,CAAC,EAAE;AAChC,4BAAA,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,EAAE;yBAC5C,CAAC;qBACH;oBAED,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,WAAW,CAAC;;oBAG7C,MAAM,eAAe,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC;oBAElF,IAAI,CAAC,eAAe,EAAE;AACpB,wBAAA,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC;oBACvD;;oBAGA,IAAI,CAAC,mBAAmB,EAAE;AAE1B,oBAAA,MAAM,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC;gBAC3C;gBAAE,OAAO,KAAc,EAAE;AACvB,oBAAA,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;gBACpC;wBAAU;;AAER,oBAAA,IAAI,CAAC,UAAU,GAAG,eAAe;AACjC,oBAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;gBAC7B;YACF;AACF,QAAA,CAAC,CAAC;IACJ;IAEQ,MAAM,iBAAiB,CAAC,WAAoB,EAAA;QAClD,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,EAAE,IAAI,IAAI,EAAE;YAC1C,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,8BAA8B,CAAC,CAAC;YAC5D;QACF;QAEA,IAAI,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,EAAE,IAAI,IAAI,EAAE;YAC/C,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,2BAA2B,CAAC,CAAC;YACzD;QACF;QAEA,IAAI,WAAW,EAAE;YACf,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,CAAC;YACzC;QACF;AAEA,QAAA,MAAM,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE;IACzC;AAEA;;AAEG;IACK,MAAM,gBAAgB,CAAC,KAAc,EAAA;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;;AAG5C,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;YAC1B,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,KAAK,CAAC;AAE/D,YAAA,IAAI,WAAW,EAAE,QAAQ,EAAE;AACzB,gBAAA,IAAI;;AAEF,oBAAA,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,WAAW,CAAC,UAAU,CAAC;AACnF,oBAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC;AACjC,oBAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC;;AAG9B,oBAAA,IAAI,WAAW,CAAC,OAAO,EAAE;AACvB,wBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;AACrB,4BAAA,KAAK,EAAE,SAAS;4BAChB,OAAO,EAAE,WAAW,CAAC,OAAO;AAC5B,4BAAA,OAAO,EAAE,IAAI;AACd,yBAAA,CAAC;oBACJ;AAEA,oBAAA,IAAI,CAAC,UAAU,GAAG,eAAe;AACjC,oBAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;oBAC3B;gBACF;gBAAE,OAAO,cAAc,EAAE;AACvB,oBAAA,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,cAAc,CAAC;gBAC7D;YACF;QACF;;;QAIA,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,QAAQ,CAAC;IAC5C;AAEA;;AAEG;AACK,IAAA,MAAM,cAAc,CAAC,KAAc,EAAE,QAAyC,EAAA;QACpF,IAAI,QAAQ,GAAG,mCAAmC;QAClD,MAAM,gBAAgB,GAAG,QAAQ,IAAI,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;AAChE,QAAA,MAAM,SAAS,GACb,CAAC,OAAO,gBAAgB,GAAG,OAAO,CAAC,KAAK,QAAQ,IAAI,gBAAgB,CAAC,OAAO,CAAC;AAC7E,aAAC,OAAO,gBAAgB,GAAG,MAAM,CAAC,KAAK,QAAQ,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAC5E,YAAA,EAAE;AAEJ,QAAA,IAAI,SAAS,KAAK,eAAe,EAAE;YACjC,QAAQ,GAAG,MAAM,IAAI,CAAC,0BAA0B,CAAC,gBAAgB,CAAC;QACpE;aAAO,IACL,SAAS,KAAK,4BAA4B;AAC1C,YAAA,gBAAgB,GAAG,SAAS,CAAC,KAAK,4BAA4B,EAC9D;YACA,QAAQ,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,cAAc,CACnD,gDAAgD,CACjD;QACH;AAAO,aAAA,IAAI,gBAAgB,GAAG,SAAS,CAAC,IAAI,OAAO,gBAAgB,CAAC,SAAS,CAAC,KAAK,QAAQ,EAAE;AAC3F,YAAA,QAAQ,GAAG,gBAAgB,CAAC,SAAS,CAAC;QACxC;AAAO,aAAA,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;YAC7C,MAAM,GAAG,GAAG,KAAgC;AAC5C,YAAA,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAwC;YAElE,QAAQ;gBACL,MAAM,GAAG,mBAAmB,CAAY;oBACxC,MAAM,GAAG,OAAO,CAAY;oBAC5B,GAAG,CAAC,SAAS,CAAY;AAC1B,oBAAA,QAAQ;AAEV,YAAA,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE;gBAChC,MAAM,MAAM,GAAG,QAA8C;AAC7D,gBAAA,QAAQ,GAAI,MAAM,CAAC,SAAS,CAAY,IAAK,MAAM,CAAC,mBAAmB,CAAY,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;YACjH;QACF;AAEA,QAAA,MAAM,iBAAiB,GAAG,gBAAgB,GAAG,mBAAmB,CAAC;AACjE,QAAA,IAAI,OAAO,iBAAiB,KAAK,QAAQ,IAAI,iBAAiB,IAAI,CAAC,IAAI,SAAS,KAAK,eAAe,EAAE;AACpG,YAAA,QAAQ,GAAG,CAAA,EAAG,QAAQ,KAAK,iBAAiB,CAAA,QAAA,EAAW,iBAAiB,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,aAAa;QACxG;AAEA,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;AACrB,YAAA,KAAK,EAAE,QAAQ;AACf,YAAA,OAAO,EAAE,QAAQ;AACjB,YAAA,OAAO,EAAE,IAAI;AACd,SAAA,CAAC;AAEF,QAAA,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC;AACpC,QAAA,IAAI,CAAC,UAAU,GAAG,eAAe;AACjC,QAAA,IAAI,CAAC,EAAE,GAAG,IAAI;AACd,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;IAC7B;AAEQ,IAAA,eAAe,CAAC,KAAc,EAAA;QACpC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AACvC,YAAA,OAAO,IAAI;QACb;QAEA,MAAM,GAAG,GAAG,KAAgC;AAC5C,QAAA,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,OAAO,GAAG,CAAC,UAAU,CAAC,KAAK,QAAQ,EAAE;AAC1D,YAAA,OAAO,GAAG,CAAC,UAAU,CAA4B;QACnD;;AAGA,QAAA,IAAI,UAAU,IAAI,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,IAAI,IAAI,OAAO,GAAG,CAAC,SAAS,CAAC,KAAK,QAAQ,EAAE;YACtF,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,SAAS,CAAC,EAAE;QACpC;AAEA,QAAA,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,QAAQ,EAAE;AACpD,YAAA,OAAO,GAAG,CAAC,OAAO,CAA4B;QAChD;AAEA,QAAA,OAAO,IAAI;IACb;IAEQ,MAAM,0BAA0B,CAAC,QAAwC,EAAA;AAC/E,QAAA,MAAM,OAAO,GACX,QAAQ,GAAG,SAAS,CAAC,IAAI,OAAO,QAAQ,CAAC,SAAS,CAAC,KAAK;AACtD,cAAG,QAAQ,CAAC,SAAS;cACnB,IAAI;AACV,QAAA,MAAM,WAAW,GACf,CAAC,OAAO,QAAQ,GAAG,aAAa,CAAC,KAAK,QAAQ,IAAI,QAAQ,CAAC,aAAa,CAAC;AACzE,aAAC,OAAO,OAAO,GAAG,aAAa,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC;AACxE,YAAA,EAAE;AACJ,QAAA,MAAM,SAAS,GAAG,WAAW,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,GAAG,EAAE;QAE9E,IAAI,SAAS,EAAE;AACb,YAAA,OAAO,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,0CAA0C,EAAE;AACtF,gBAAA,MAAM,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE;AAChC,aAAA,CAAC;QACJ;QAEA,OAAO,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,oCAAoC,CAAC;IACnF;IAEQ,MAAM,iBAAiB,CAAC,GAAW,EAAA;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;QAC9B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;AAC5B,YAAA,OAAO,EAAE;QACX;AAEA,QAAA,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,kBAAkB,CAAC,SAAS,CAAC;AAC/E,QAAA,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,kBAAkB,CAAC,SAAS,CAAC;QAC/E,MAAM,MAAM,GAAG,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,UAAU,CAAA,CAAE,CAAC,IAAI,EAAE;AACnD,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,CAAC;IAC5E;;;AAMA;;AAEG;IACK,yBAAyB,GAAA;QAC/B,OAAO,IAAI,CAAC,iBAAiB,EAAE,qBAAqB,EAAE,IAAI,4BAA4B;IACxF;AAEA;;AAEG;IACK,wBAAwB,CAAC,IAA2B,EAAE,SAAkB,EAAA;QAC9E,IAAI,CAAC,IAAI,CAAC,qBAAqB;YAAE;;AAGjC,QAAA,IAAI,IAAI,CAAC,qBAAqB,EAAE;AAC9B,YAAA,IAAI,CAAC,8BAA8B,CAAC,IAAI,EAAE,SAAS,CAAC;YACpD;QACF;;AAGA,QAAA,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE;AAClC,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,yBAAyB,EAAE;QACtD,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,qBAAqB,CAAC,eAAe,CAAC,aAAa,CAAC;;AAGtF,QAAA,IAAI,CAAC,8BAA8B,CAAC,IAAI,EAAE,SAAS,CAAC;;AAGpD,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,qBAAqB,CAAC,QAAQ;QACpD,QAAQ,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,QAAgB,KAAI;AACrD,YAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC;AACtC,QAAA,CAAC,CAAC;AACF,QAAA,QAAQ,CAAC,cAAc,CAAC,SAAS,CAAC,MAAK;YACrC,IAAI,CAAC,sBAAsB,EAAE;AAC/B,QAAA,CAAC,CAAC;IACJ;AAEA;;AAEG;IACK,8BAA8B,CAAC,IAA2B,EAAE,SAAkB,EAAA;QACpF,IAAI,CAAC,IAAI,CAAC,qBAAqB;YAAE;QAEjC,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,eAAe,EAAE,IAAI,CAAC;QAC1D,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,WAAW,EAAE,SAAS,CAAC;IAC7D;AAEA;;AAEG;IACK,yBAAyB,GAAA;AAC/B,QAAA,IAAI,IAAI,CAAC,qBAAqB,EAAE;AAC9B,YAAA,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE;AACpC,YAAA,IAAI,CAAC,qBAAqB,GAAG,SAAS;QACxC;AACA,QAAA,IAAI,IAAI,CAAC,qBAAqB,EAAE;AAC9B,YAAA,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE;QACpC;IACF;AAEA;;AAEG;AACO,IAAA,MAAM,sBAAsB,GAAA;QACpC,IAAI,CAAC,IAAI,CAAC,iBAAiB;YAAE;AAE7B,QAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC;AACjC,QAAA,IAAI;YACF,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,EAAE;AACpE,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC;AACpC,YAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC;QAChC;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC;AACpD,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;AACrB,gBAAA,KAAK,EAAE,QAAQ;AACf,gBAAA,OAAO,EAAE,iDAAiD;AAC1D,gBAAA,OAAO,EAAE,IAAI;AACd,aAAA,CAAC;QACJ;gBAAU;AACR,YAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC;QACpC;IACF;AAEA;;AAEG;IACK,mBAAmB,GAAA;AACzB,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;AAC5B,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9B,IAAI,CAAC,yBAAyB,EAAE;IAClC;8GA9bW,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAzB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,MAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAuBzB,eAAe,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,uBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,IAAA,EA2Be,gBAAgB,6BCzH3D,iuGA+FA,EAAA,MAAA,EAAA,CAAA,6VAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDhDE,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAAA,WAAA,EAAA,MAAA,EAAA,cAAA,EAAA,UAAA,EAAA,yBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,OAAA,EAAA,OAAA,EAAA,MAAA,EAAA,IAAA,EAAA,aAAA,EAAA,WAAA,EAAA,WAAA,EAAA,MAAA,EAAA,cAAA,EAAA,MAAA,EAAA,aAAA,EAAA,cAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,SAAA,EAAA,aAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,SAAA,EAAA,YAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,aAAA,EAAA,OAAA,EAAA,OAAA,EAAA,MAAA,EAAA,IAAA,EAAA,MAAA,EAAA,cAAA,EAAA,kBAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,SAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACnB,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAN,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAAA,OAAA,EAAA,MAAA,EAAA,MAAA,EAAA,YAAA,EAAA,UAAA,EAAA,UAAA,EAAA,MAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,YAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,KAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,iBAAiB,8BACjB,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,OAAA,EAAA,OAAA,EAAA,MAAA,EAAA,IAAA,EAAA,WAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,SAAA,EAAA,aAAA,EAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAChB,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,EAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACnB,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAI,IAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,MAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,kBAAkB,+BAClB,kCAAkC,EAAA,QAAA,EAAA,8BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAL,EAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,KAAA,EAAA,CAAA,CAAA;;2FAWvB,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBANrC,SAAS;AAGS,YAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,uBAAuB,CAAC,KAAK,EAAA,OAAA,EACrC,CAAC,GAAG,OAAO,CAAC,EAAA,QAAA,EAAA,iuGAAA,EAAA,MAAA,EAAA,CAAA,6VAAA,CAAA,EAAA;;sBAyBpB,SAAS;uBAAC,eAAe;;sBA2BzB,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,oBAAoB,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"acorex-platform-module-auth-client-pin-code.constants-CRsFG7fg.mjs","sources":["../../../../libs/modules/auth/client/src/lib/shared/constants/pin-code.constants.ts"],"sourcesContent":["//#region ---- PIN code constants ----\n\nexport const AXP_AUTH_PIN_CODE_LENGTH = 4;\n\nexport const AXP_AUTH_PIN_CODE_PATTERN = /^\\d{4}$/;\n\n//#endregion\n"],"names":[],"mappings":"AAAA;AAEO,MAAM,wBAAwB,GAAG;AAEjC,MAAM,yBAAyB,GAAG;AAEzC;;;;"}
1
+ {"version":3,"file":"acorex-platform-module-auth-client-pin-code.constants-CRsFG7fg.mjs","sources":["../../../../libs/modules/auth/client/src/lib/shared/constants/pin-code.constants.ts"],"sourcesContent":["//#region ---- PIN code constants ----\n\nexport const AXP_AUTH_PIN_CODE_LENGTH = 4;\n\nexport const AXP_AUTH_PIN_CODE_PATTERN = /^\\d{4}$/;\n\n//#endregion\n"],"names":[],"mappings":"AAAA;AAEO,MAAM,wBAAwB,GAAG;AAEjC,MAAM,yBAAyB,GAAG;AAEzC;;"}
@@ -1,9 +1,9 @@
1
1
  import * as i1 from '@acorex/components/button';
2
2
  import { AXButtonModule } from '@acorex/components/button';
3
- import * as i5 from '@acorex/core/translation';
3
+ import * as i5$1 from '@acorex/core/translation';
4
4
  import { AXTranslationModule } from '@acorex/core/translation';
5
5
  import { AXPPlatformSettingsLoadState, AXPSettingsService, AXPCommonSettings } from '@acorex-platform/framework-client/common';
6
- import * as i3 from '@angular/common';
6
+ import * as i5 from '@angular/common';
7
7
  import { CommonModule } from '@angular/common';
8
8
  import * as i0 from '@angular/core';
9
9
  import { inject, signal, ChangeDetectionStrategy, Component } from '@angular/core';
@@ -36,7 +36,7 @@ class AXMPlatformSettingsUnavailableComponent {
36
36
  this.showTechnicalDetail.set(debugMode === true);
37
37
  }
38
38
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMPlatformSettingsUnavailableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
39
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXMPlatformSettingsUnavailableComponent, isStandalone: true, selector: "axm-platform-settings-unavailable", ngImport: i0, template: "<div class=\"min-h-full w-full flex items-center justify-center p-8 lightest-surface\">\n <div class=\"max-w-lg text-center flex flex-col gap-4\">\n <h1 class=\"font-bold text-2xl\">\n {{ '@auth:startup-error.title' | translate | async }}\n </h1>\n <p class=\"text-neutral-600\">\n {{ '@auth:startup-error.description' | translate | async }}\n </p>\n @if (showTechnicalDetail() !== null) {\n <!--->\n <!-- ----- Technical detail when Debug Mode is enabled in cached settings ----- -->\n @if (showTechnicalDetail() && detail) {\n <p class=\"text-sm text-neutral-500 break-words\">{{ detail }}</p>\n }\n <!-- ----- Contact admin tip when technical detail is hidden ----- -->\n @else {\n <p class=\"text-sm text-neutral-500\">\n {{ '@auth:startup-error.contact-admin' | translate | async }}\n </p>\n }\n }\n <ax-button\n color=\"primary\"\n class=\"mx-auto\"\n [text]=\"'@auth:startup-error.retry' | translate | async\"\n (onClick)=\"handleRetry()\"\n ></ax-button>\n </div>\n</div>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
39
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXMPlatformSettingsUnavailableComponent, isStandalone: true, selector: "axm-platform-settings-unavailable", ngImport: i0, template: "<div class=\"min-h-full w-full flex items-center justify-center p-8 lightest-surface\">\n <div class=\"max-w-lg text-center flex flex-col gap-4\">\n <h1 class=\"font-bold text-2xl\">\n {{ '@auth:startup-error.title' | translate | async }}\n </h1>\n <p class=\"text-neutral-600\">\n {{ '@auth:startup-error.description' | translate | async }}\n </p>\n @if (showTechnicalDetail() !== null) {\n <!--->\n <!-- ----- Technical detail when Debug Mode is enabled in cached settings ----- -->\n @if (showTechnicalDetail() && detail) {\n <p class=\"text-sm text-neutral-500 break-words\">{{ detail }}</p>\n }\n <!-- ----- Contact admin tip when technical detail is hidden ----- -->\n @else {\n <p class=\"text-sm text-neutral-500\">\n {{ '@auth:startup-error.contact-admin' | translate | async }}\n </p>\n }\n }\n <ax-button\n color=\"primary\"\n class=\"mx-auto\"\n [text]=\"'@auth:startup-error.retry' | translate | async\"\n (onClick)=\"handleRetry()\"\n ></ax-button>\n </div>\n</div>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.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: AXTranslationModule }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i5$1.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
40
40
  }
41
41
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMPlatformSettingsUnavailableComponent, decorators: [{
42
42
  type: Component,
@@ -44,4 +44,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
44
44
  }], ctorParameters: () => [] });
45
45
 
46
46
  export { AXMPlatformSettingsUnavailableComponent };
47
- //# sourceMappingURL=acorex-platform-module-auth-client-platform-settings-unavailable.component-BEVkQ3jh.mjs.map
47
+ //# sourceMappingURL=acorex-platform-module-auth-client-platform-settings-unavailable.component-BJMtsa99.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"acorex-platform-module-auth-client-platform-settings-unavailable.component-BEVkQ3jh.mjs","sources":["../../../../libs/modules/auth/client/src/lib/pages/unavailable/platform-settings-unavailable.component.ts","../../../../libs/modules/auth/client/src/lib/pages/unavailable/platform-settings-unavailable.component.html"],"sourcesContent":["import { AXButtonModule } from '@acorex/components/button';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport {\n AXPCommonSettings,\n AXPPlatformSettingsLoadState,\n AXPSettingsService,\n} from '@acorex-platform/framework-client/common';\nimport { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, inject, signal } from '@angular/core';\n\n//#region ----- Platform settings unavailable page -----\n\n@Component({\n selector: 'axm-platform-settings-unavailable',\n templateUrl: './platform-settings-unavailable.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, AXButtonModule, AXTranslationModule],\n})\nexport class AXMPlatformSettingsUnavailableComponent {\n //#region ----- Services & Dependencies -----\n\n private readonly loadState = inject(AXPPlatformSettingsLoadState);\n private readonly settingsService = inject(AXPSettingsService);\n\n //#endregion\n\n //#region ----- State Signals -----\n\n protected readonly detail = this.loadState.message();\n /** `null` until cached Debug Mode is resolved. */\n protected readonly showTechnicalDetail = signal<boolean | null>(null);\n\n //#endregion\n\n //#region ----- Lifecycle -----\n\n constructor() {\n void this.resolveShowTechnicalDetail();\n }\n\n //#endregion\n\n //#region ----- Event Handlers -----\n\n protected handleRetry(): void {\n window.location.assign('/');\n }\n\n //#endregion\n\n //#region ----- Private -----\n\n private async resolveShowTechnicalDetail(): Promise<void> {\n const debugMode = await this.settingsService.peekPlatformCached(AXPCommonSettings.DebugMode);\n this.showTechnicalDetail.set(debugMode === true);\n }\n\n //#endregion\n}\n\n//#endregion\n","<div class=\"min-h-full w-full flex items-center justify-center p-8 lightest-surface\">\n <div class=\"max-w-lg text-center flex flex-col gap-4\">\n <h1 class=\"font-bold text-2xl\">\n {{ '@auth:startup-error.title' | translate | async }}\n </h1>\n <p class=\"text-neutral-600\">\n {{ '@auth:startup-error.description' | translate | async }}\n </p>\n @if (showTechnicalDetail() !== null) {\n <!--->\n <!-- ----- Technical detail when Debug Mode is enabled in cached settings ----- -->\n @if (showTechnicalDetail() && detail) {\n <p class=\"text-sm text-neutral-500 break-words\">{{ detail }}</p>\n }\n <!-- ----- Contact admin tip when technical detail is hidden ----- -->\n @else {\n <p class=\"text-sm text-neutral-500\">\n {{ '@auth:startup-error.contact-admin' | translate | async }}\n </p>\n }\n }\n <ax-button\n color=\"primary\"\n class=\"mx-auto\"\n [text]=\"'@auth:startup-error.retry' | translate | async\"\n (onClick)=\"handleRetry()\"\n ></ax-button>\n </div>\n</div>\n"],"names":["i2","i3"],"mappings":";;;;;;;;;;AAUA;MAQa,uCAAuC,CAAA;;;AAkBlD,IAAA,WAAA,GAAA;;AAfiB,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,4BAA4B,CAAC;AAChD,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAC,kBAAkB,CAAC;;;AAM1C,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE;;QAEjC,IAAA,CAAA,mBAAmB,GAAG,MAAM,CAAiB,IAAI;gGAAC;AAOnE,QAAA,KAAK,IAAI,CAAC,0BAA0B,EAAE;IACxC;;;IAMU,WAAW,GAAA;AACnB,QAAA,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC;IAC7B;;;AAMQ,IAAA,MAAM,0BAA0B,GAAA;AACtC,QAAA,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,SAAS,CAAC;QAC5F,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,SAAS,KAAK,IAAI,CAAC;IAClD;8GArCW,uCAAuC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAvC,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,uCAAuC,6FClBpD,glCA6BA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDbY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,cAAc,6XAAE,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAEhD,uCAAuC,EAAA,UAAA,EAAA,CAAA;kBANnD,SAAS;+BACE,mCAAmC,EAAA,eAAA,EAE5B,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,YAAY,EAAE,cAAc,EAAE,mBAAmB,CAAC,EAAA,QAAA,EAAA,glCAAA,EAAA;;;;;"}
1
+ {"version":3,"file":"acorex-platform-module-auth-client-platform-settings-unavailable.component-BJMtsa99.mjs","sources":["../../../../libs/modules/auth/client/src/lib/pages/unavailable/platform-settings-unavailable.component.ts","../../../../libs/modules/auth/client/src/lib/pages/unavailable/platform-settings-unavailable.component.html"],"sourcesContent":["import { AXButtonModule } from '@acorex/components/button';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport {\n AXPCommonSettings,\n AXPPlatformSettingsLoadState,\n AXPSettingsService,\n} from '@acorex-platform/framework-client/common';\nimport { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, inject, signal } from '@angular/core';\n\n//#region ----- Platform settings unavailable page -----\n\n@Component({\n selector: 'axm-platform-settings-unavailable',\n templateUrl: './platform-settings-unavailable.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, AXButtonModule, AXTranslationModule],\n})\nexport class AXMPlatformSettingsUnavailableComponent {\n //#region ----- Services & Dependencies -----\n\n private readonly loadState = inject(AXPPlatformSettingsLoadState);\n private readonly settingsService = inject(AXPSettingsService);\n\n //#endregion\n\n //#region ----- State Signals -----\n\n protected readonly detail = this.loadState.message();\n /** `null` until cached Debug Mode is resolved. */\n protected readonly showTechnicalDetail = signal<boolean | null>(null);\n\n //#endregion\n\n //#region ----- Lifecycle -----\n\n constructor() {\n void this.resolveShowTechnicalDetail();\n }\n\n //#endregion\n\n //#region ----- Event Handlers -----\n\n protected handleRetry(): void {\n window.location.assign('/');\n }\n\n //#endregion\n\n //#region ----- Private -----\n\n private async resolveShowTechnicalDetail(): Promise<void> {\n const debugMode = await this.settingsService.peekPlatformCached(AXPCommonSettings.DebugMode);\n this.showTechnicalDetail.set(debugMode === true);\n }\n\n //#endregion\n}\n\n//#endregion\n","<div class=\"min-h-full w-full flex items-center justify-center p-8 lightest-surface\">\n <div class=\"max-w-lg text-center flex flex-col gap-4\">\n <h1 class=\"font-bold text-2xl\">\n {{ '@auth:startup-error.title' | translate | async }}\n </h1>\n <p class=\"text-neutral-600\">\n {{ '@auth:startup-error.description' | translate | async }}\n </p>\n @if (showTechnicalDetail() !== null) {\n <!--->\n <!-- ----- Technical detail when Debug Mode is enabled in cached settings ----- -->\n @if (showTechnicalDetail() && detail) {\n <p class=\"text-sm text-neutral-500 break-words\">{{ detail }}</p>\n }\n <!-- ----- Contact admin tip when technical detail is hidden ----- -->\n @else {\n <p class=\"text-sm text-neutral-500\">\n {{ '@auth:startup-error.contact-admin' | translate | async }}\n </p>\n }\n }\n <ax-button\n color=\"primary\"\n class=\"mx-auto\"\n [text]=\"'@auth:startup-error.retry' | translate | async\"\n (onClick)=\"handleRetry()\"\n ></ax-button>\n </div>\n</div>\n"],"names":["i2","i3"],"mappings":";;;;;;;;;;AAUA;MAQa,uCAAuC,CAAA;;;AAkBlD,IAAA,WAAA,GAAA;;AAfiB,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,4BAA4B,CAAC;AAChD,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAC,kBAAkB,CAAC;;;AAM1C,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE;;QAEjC,IAAA,CAAA,mBAAmB,GAAG,MAAM,CAAiB,IAAI;gGAAC;AAOnE,QAAA,KAAK,IAAI,CAAC,0BAA0B,EAAE;IACxC;;;IAMU,WAAW,GAAA;AACnB,QAAA,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC;IAC7B;;;AAMQ,IAAA,MAAM,0BAA0B,GAAA;AACtC,QAAA,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,SAAS,CAAC;QAC5F,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,SAAS,KAAK,IAAI,CAAC;IAClD;8GArCW,uCAAuC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAvC,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,uCAAuC,6FClBpD,glCA6BA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDbY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,cAAc,qXAAE,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAEhD,uCAAuC,EAAA,UAAA,EAAA,CAAA;kBANnD,SAAS;+BACE,mCAAmC,EAAA,eAAA,EAE5B,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,YAAY,EAAE,cAAc,EAAE,mBAAmB,CAAC,EAAA,QAAA,EAAA,glCAAA,EAAA;;;"}
@@ -7,12 +7,12 @@ import { AXFormatModule } from '@acorex/core/format';
7
7
  import * as i5 from '@acorex/core/translation';
8
8
  import { AXTranslationModule } from '@acorex/core/translation';
9
9
  import { AXPPageLayoutBaseComponent, AXPPageLayoutBase } from '@acorex-platform/framework-client/layout/views';
10
- import * as i3$1 from '@angular/common';
10
+ import * as i5$1 from '@angular/common';
11
11
  import { CommonModule, AsyncPipe } from '@angular/common';
12
12
  import * as i0 from '@angular/core';
13
13
  import { input, inject, signal, computed, effect, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
14
14
  import { isEmpty } from 'lodash';
15
- import { z as formatCompactActivityCount } from './acorex-platform-module-auth-client-acorex-platform-module-auth-client-CTf7qxkQ.mjs';
15
+ import { z as formatCompactActivityCount } from './acorex-platform-module-auth-client-acorex-platform-module-auth-client-CRl74b8g.mjs';
16
16
 
17
17
  //#endregion
18
18
  //#region ---- Constants ----
@@ -213,7 +213,7 @@ class AXMProfileActivityChartComponent extends AXPPageLayoutBaseComponent {
213
213
  provide: AXPPageLayoutBase,
214
214
  useExisting: AXMProfileActivityChartComponent,
215
215
  },
216
- ], usesInheritance: true, ngImport: i0, template: "<div class=\"__panel\" *translate=\"let t\">\n <header class=\"__header\">\n <div class=\"__title-row\">\n <h3 class=\"__title\">{{ '@auth:profile-page.components.activity-chart.title' | translate | async }}</h3>\n <ax-icon icon=\"fa-light fa-circle-info\" class=\"__info-icon\"></ax-icon>\n </div>\n </header>\n\n @if (heatmapLayout() === 'calendar') {\n <!-- ----- Calendar heatmap for month and longer ranges ----- -->\n <div class=\"__heatmap-wrap\" [style.--week-count]=\"weekCount()\">\n <div class=\"__month-labels\" aria-hidden=\"true\">\n @for (month of columnLabels(); track month.key) {\n <span class=\"__month-label\" [style.grid-column-start]=\"month.weekIndex + 2\">\n {{ month.date | format: 'date' : 'MMM' | async }}\n </span>\n }\n </div>\n\n <div class=\"__heatmap\">\n <div class=\"__weekday-labels\" aria-hidden=\"true\">\n @for (label of weekdayLabels; track label) {\n <span class=\"__weekday-label\" [style.grid-row]=\"weekdayRowIndex(label)\">{{ label }}</span>\n }\n </div>\n\n <div\n class=\"__grid\"\n role=\"img\"\n [attr.aria-label]=\"'@auth:profile-page.components.activity-chart.aria-label' | translate | async\"\n >\n @for (week of weeks(); track $index) {\n @for (day of week.days; track day.date.getTime()) {\n <span\n class=\"__cell\"\n [class.--level-0]=\"day.level === 0\"\n [class.--level-1]=\"day.level === 1\"\n [class.--level-2]=\"day.level === 2\"\n [class.--level-3]=\"day.level === 3\"\n [class.--level-4]=\"day.level === 4\"\n [attr.title]=\"cellTitle(day)\"\n ></span>\n }\n }\n </div>\n </div>\n </div>\n }\n <!-- ----- Full-width day or hour strip for short ranges ----- -->\n @else if (heatmapLayout() === 'hours') {\n <!-- ----- Hour cells for a single-day window ----- -->\n <div\n class=\"__strip __strip--hours\"\n role=\"img\"\n [attr.aria-label]=\"'@auth:profile-page.components.activity-chart.aria-label' | translate | async\"\n >\n @for (hour of hours(); track hour.hour) {\n <div class=\"__strip-col\">\n <span class=\"__strip-label\">\n @if (showHourLabel(hour.hour)) {\n <!-- ----- Hour tick every three hours ----- -->\n {{ hour.date | format: 'datetime' : shortTimeFormat() | async }}\n }\n </span>\n <span\n class=\"__cell\"\n [class.--level-0]=\"hour.level === 0\"\n [class.--level-1]=\"hour.level === 1\"\n [class.--level-2]=\"hour.level === 2\"\n [class.--level-3]=\"hour.level === 3\"\n [class.--level-4]=\"hour.level === 4\"\n [attr.title]=\"hourCellTitle(hour)\"\n ></span>\n </div>\n }\n </div>\n }\n <!-- ----- Weekday cells for a seven-day window ----- -->\n @else {\n <div\n class=\"__strip __strip--days\"\n [class.--dense]=\"dayCount() > 14\"\n [style.--day-count]=\"dayCount()\"\n role=\"img\"\n [attr.aria-label]=\"'@auth:profile-page.components.activity-chart.aria-label' | translate | async\"\n >\n @for (day of stripDays(); track day.date.getTime(); let index = $index) {\n <div class=\"__strip-col\">\n <span class=\"__strip-label\">\n @if (showDayStripLabel(index)) {\n <!-- ----- Weekday or day-of-month tick ----- -->\n {{ day.date | format: 'date' : dayStripLabelFormatFor(day) | async }}\n }\n </span>\n <span\n class=\"__cell\"\n [class.--level-0]=\"day.level === 0\"\n [class.--level-1]=\"day.level === 1\"\n [class.--level-2]=\"day.level === 2\"\n [class.--level-3]=\"day.level === 3\"\n [class.--level-4]=\"day.level === 4\"\n [attr.title]=\"cellTitle(day)\"\n ></span>\n </div>\n }\n </div>\n }\n\n <footer class=\"__footer\">\n <div class=\"__legend\" aria-hidden=\"true\">\n <span class=\"__legend-label\">{{ '@auth:profile-page.components.activity-chart.legend.less' | translate | async }}</span>\n @for (level of intensityLevels; track level) {\n <span class=\"__legend-cell\" [class]=\"'--level-' + level\"></span>\n }\n <span class=\"__legend-label\">{{ '@auth:profile-page.components.activity-chart.legend.more' | translate | async }}</span>\n </div>\n\n <!-- ----- Sign-in summaries for the visible heatmap window ----- -->\n <dl class=\"__stats\">\n <div class=\"__stat\">\n <dd>{{ formatCount(stats().total) }}</dd>\n <dt>{{ '@auth:profile-page.components.activity-chart.stats.total' | translate | async }}</dt>\n </div>\n <div class=\"__stat\">\n <dd>{{ stats().longestStreak }}</dd>\n <dt>\n @if (stats().longestStreak === 1) {\n <!-- ----- Singular streak unit ----- -->\n {{ '@auth:profile-page.components.activity-chart.stats.day-streak' | translate | async }}\n }\n <!-- ----- Plural streak unit ----- -->\n @else {\n {{ '@auth:profile-page.components.activity-chart.stats.days-streak' | translate | async }}\n }\n </dt>\n </div>\n <div class=\"__stat\">\n <dd>{{ formatCount(stats().avgPerDay) }}</dd>\n <dt>{{ '@auth:profile-page.components.activity-chart.stats.avg-day' | translate | async }}</dt>\n </div>\n <div class=\"__stat\">\n <dd>{{ formatCount(stats().avgPerWeek) }}</dd>\n <dt>{{ '@auth:profile-page.components.activity-chart.stats.avg-week' | translate | async }}</dt>\n </div>\n </dl>\n </footer>\n</div>\n", styles: ["@layer properties;.axm-profile-activity-chart{display:block;width:100%}.axm-profile-activity-chart .__panel{width:100%;border-radius:var(--radius-2xl, 1rem);border-style:var(--tw-border-style);border-width:1px;background-color:var(--color-lightest);color:var(--color-on-lightest);border-color:var(--color-border-lightest);padding:calc(var(--spacing, .25rem) * 6);--tw-shadow: 0 4px 6px -1px var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 2px 4px -2px 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);border-color:rgb(var(--ax-sys-color-border-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface))}.axm-profile-activity-chart .__header{margin-bottom:calc(var(--spacing, .25rem) * 5);display:flex;align-items:flex-start;justify-content:space-between;gap:calc(var(--spacing, .25rem) * 4)}.axm-profile-activity-chart .__title-row{display:inline-flex;align-items:center;gap:calc(var(--spacing, .25rem) * 2)}.axm-profile-activity-chart .__title{margin:0;font-size:var(--text-lg, 1.125rem);line-height:var(--tw-leading, var(--text-lg--line-height, calc(1.75 / 1.125)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);color:rgb(var(--ax-sys-color-on-lightest-surface))}.axm-profile-activity-chart .__info-icon{opacity:50%;color:rgb(var(--ax-sys-color-on-light-surface))}.axm-profile-activity-chart .__footer{margin-top:calc(var(--spacing, .25rem) * 4);display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;column-gap:calc(var(--spacing, .25rem) * 6);row-gap:calc(var(--spacing, .25rem) * 3);padding-top:calc(var(--spacing, .25rem) * 3);border-top:1px solid rgb(var(--ax-sys-color-border-lightest-surface))}.axm-profile-activity-chart .__stats{margin:0;display:flex;flex-wrap:wrap;align-items:center;column-gap:calc(var(--spacing, .25rem) * 4);row-gap:var(--spacing, .25rem)}.axm-profile-activity-chart .__stat{margin:0;display:inline-flex;align-items:baseline;gap:calc(var(--spacing, .25rem) * 1.5)}.axm-profile-activity-chart .__stat dt{font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));--tw-font-weight: var(--font-weight-normal, 400);font-weight:var(--font-weight-normal, 400);color:rgb(var(--ax-sys-color-on-light-surface))}.axm-profile-activity-chart .__stat dd{margin:0;font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,);color:rgb(var(--ax-sys-color-on-lightest-surface))}.axm-profile-activity-chart .__heatmap-wrap{--week-count: 53;width:100%;overflow-x:auto;padding-bottom:calc(var(--spacing, .25rem) * 2)}.axm-profile-activity-chart .__month-labels{margin-bottom:calc(var(--spacing, .25rem) * 2);display:grid;width:100%;gap:var(--spacing, .25rem);grid-template-columns:1.75rem repeat(var(--week-count, 53),minmax(0,1fr))}.axm-profile-activity-chart .__month-label{font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));color:rgb(var(--ax-sys-color-on-light-surface))}.axm-profile-activity-chart .__heatmap{display:grid;width:100%;gap:calc(var(--spacing, .25rem) * 2);grid-template-columns:1.75rem 1fr;align-items:stretch}.axm-profile-activity-chart .__weekday-labels{display:grid;gap:var(--spacing, .25rem);align-self:stretch;grid-template-rows:repeat(7,1fr)}.axm-profile-activity-chart .__weekday-label{display:flex;align-items:center;font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));color:rgb(var(--ax-sys-color-on-light-surface))}.axm-profile-activity-chart .__grid{display:grid;width:100%;gap:var(--spacing, .25rem);grid-template-rows:repeat(7,auto);grid-auto-flow:column;grid-auto-columns:minmax(0,1fr)}.axm-profile-activity-chart .__cell{width:100%;border-radius:var(--radius-sm, .25rem);aspect-ratio:1}.axm-profile-activity-chart .__cell.--level-0{background:rgb(var(--ax-sys-color-dark-surface))}.axm-profile-activity-chart .__cell.--level-1{background:rgb(var(--ax-sys-color-primary-200))}.axm-profile-activity-chart .__cell.--level-2{background:rgb(var(--ax-sys-color-primary-400))}.axm-profile-activity-chart .__cell.--level-3{background:rgb(var(--ax-sys-color-primary-600))}.axm-profile-activity-chart .__cell.--level-4{background:rgb(var(--ax-sys-color-primary-800))}.axm-profile-activity-chart .__strip{display:grid;width:100%;gap:calc(var(--spacing, .25rem) * 2)}.axm-profile-activity-chart .__strip--days{--day-count: 7;grid-template-columns:repeat(var(--day-count, 7),minmax(0,1fr))}.axm-profile-activity-chart .__strip--hours{grid-template-columns:repeat(24,minmax(0,1fr));gap:.25rem}.axm-profile-activity-chart .__strip-col{display:flex;min-width:0px;flex-direction:column;gap:var(--spacing, .25rem)}.axm-profile-activity-chart .__strip-label{display:block;text-align:center;font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));white-space:nowrap;min-height:1rem;overflow:visible;color:rgb(var(--ax-sys-color-on-light-surface))}.axm-profile-activity-chart .__strip .__cell{width:100%;border-radius:var(--radius-md, .375rem);height:3.5rem;aspect-ratio:auto}.axm-profile-activity-chart .__strip--hours .__cell{height:2.5rem;border-radius:.25rem}.axm-profile-activity-chart .__strip--days.--dense .__cell{height:2.25rem}.axm-profile-activity-chart .__legend{display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * 1.5)}.axm-profile-activity-chart .__legend-label{font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));color:rgb(var(--ax-sys-color-on-light-surface))}.axm-profile-activity-chart .__legend-cell{width:calc(var(--spacing, .25rem) * 3);height:calc(var(--spacing, .25rem) * 3);border-radius:var(--radius-sm, .25rem)}.axm-profile-activity-chart .__legend-cell.--level-0{background:rgb(var(--ax-sys-color-dark-surface))}.axm-profile-activity-chart .__legend-cell.--level-1{background:rgb(var(--ax-sys-color-primary-200))}.axm-profile-activity-chart .__legend-cell.--level-2{background:rgb(var(--ax-sys-color-primary-400))}.axm-profile-activity-chart .__legend-cell.--level-3{background:rgb(var(--ax-sys-color-primary-600))}.axm-profile-activity-chart .__legend-cell.--level-4{background:rgb(var(--ax-sys-color-primary-800))}@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;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@property --tw-ordinal{syntax: \"*\"; inherits: false;}@property --tw-slashed-zero{syntax: \"*\"; inherits: false;}@property --tw-numeric-figure{syntax: \"*\"; inherits: false;}@property --tw-numeric-spacing{syntax: \"*\"; inherits: false;}@property --tw-numeric-fraction{syntax: \"*\"; inherits: false;}@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;--tw-font-weight: initial;--tw-ordinal: initial;--tw-slashed-zero: initial;--tw-numeric-figure: initial;--tw-numeric-spacing: initial;--tw-numeric-fraction: initial}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i3.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "ngmodule", type: AXFormatModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "directive", type: i5.AXTranslatorDirective, selector: "[translate]" }, { kind: "pipe", type: i3$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.AXFormatPipe, name: "format" }, { kind: "pipe", type: i5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
216
+ ], usesInheritance: true, ngImport: i0, template: "<div class=\"__panel\" *translate=\"let t\">\n <header class=\"__header\">\n <div class=\"__title-row\">\n <h3 class=\"__title\">{{ '@auth:profile-page.components.activity-chart.title' | translate | async }}</h3>\n <ax-icon icon=\"fa-light fa-circle-info\" class=\"__info-icon\"></ax-icon>\n </div>\n </header>\n\n @if (heatmapLayout() === 'calendar') {\n <!-- ----- Calendar heatmap for month and longer ranges ----- -->\n <div class=\"__heatmap-wrap\" [style.--week-count]=\"weekCount()\">\n <div class=\"__month-labels\" aria-hidden=\"true\">\n @for (month of columnLabels(); track month.key) {\n <span class=\"__month-label\" [style.grid-column-start]=\"month.weekIndex + 2\">\n {{ month.date | format: 'date' : 'MMM' | async }}\n </span>\n }\n </div>\n\n <div class=\"__heatmap\">\n <div class=\"__weekday-labels\" aria-hidden=\"true\">\n @for (label of weekdayLabels; track label) {\n <span class=\"__weekday-label\" [style.grid-row]=\"weekdayRowIndex(label)\">{{ label }}</span>\n }\n </div>\n\n <div\n class=\"__grid\"\n role=\"img\"\n [attr.aria-label]=\"'@auth:profile-page.components.activity-chart.aria-label' | translate | async\"\n >\n @for (week of weeks(); track $index) {\n @for (day of week.days; track day.date.getTime()) {\n <span\n class=\"__cell\"\n [class.--level-0]=\"day.level === 0\"\n [class.--level-1]=\"day.level === 1\"\n [class.--level-2]=\"day.level === 2\"\n [class.--level-3]=\"day.level === 3\"\n [class.--level-4]=\"day.level === 4\"\n [attr.title]=\"cellTitle(day)\"\n ></span>\n }\n }\n </div>\n </div>\n </div>\n }\n <!-- ----- Full-width day or hour strip for short ranges ----- -->\n @else if (heatmapLayout() === 'hours') {\n <!-- ----- Hour cells for a single-day window ----- -->\n <div\n class=\"__strip __strip--hours\"\n role=\"img\"\n [attr.aria-label]=\"'@auth:profile-page.components.activity-chart.aria-label' | translate | async\"\n >\n @for (hour of hours(); track hour.hour) {\n <div class=\"__strip-col\">\n <span class=\"__strip-label\">\n @if (showHourLabel(hour.hour)) {\n <!-- ----- Hour tick every three hours ----- -->\n {{ hour.date | format: 'datetime' : shortTimeFormat() | async }}\n }\n </span>\n <span\n class=\"__cell\"\n [class.--level-0]=\"hour.level === 0\"\n [class.--level-1]=\"hour.level === 1\"\n [class.--level-2]=\"hour.level === 2\"\n [class.--level-3]=\"hour.level === 3\"\n [class.--level-4]=\"hour.level === 4\"\n [attr.title]=\"hourCellTitle(hour)\"\n ></span>\n </div>\n }\n </div>\n }\n <!-- ----- Weekday cells for a seven-day window ----- -->\n @else {\n <div\n class=\"__strip __strip--days\"\n [class.--dense]=\"dayCount() > 14\"\n [style.--day-count]=\"dayCount()\"\n role=\"img\"\n [attr.aria-label]=\"'@auth:profile-page.components.activity-chart.aria-label' | translate | async\"\n >\n @for (day of stripDays(); track day.date.getTime(); let index = $index) {\n <div class=\"__strip-col\">\n <span class=\"__strip-label\">\n @if (showDayStripLabel(index)) {\n <!-- ----- Weekday or day-of-month tick ----- -->\n {{ day.date | format: 'date' : dayStripLabelFormatFor(day) | async }}\n }\n </span>\n <span\n class=\"__cell\"\n [class.--level-0]=\"day.level === 0\"\n [class.--level-1]=\"day.level === 1\"\n [class.--level-2]=\"day.level === 2\"\n [class.--level-3]=\"day.level === 3\"\n [class.--level-4]=\"day.level === 4\"\n [attr.title]=\"cellTitle(day)\"\n ></span>\n </div>\n }\n </div>\n }\n\n <footer class=\"__footer\">\n <div class=\"__legend\" aria-hidden=\"true\">\n <span class=\"__legend-label\">{{ '@auth:profile-page.components.activity-chart.legend.less' | translate | async }}</span>\n @for (level of intensityLevels; track level) {\n <span class=\"__legend-cell\" [class]=\"'--level-' + level\"></span>\n }\n <span class=\"__legend-label\">{{ '@auth:profile-page.components.activity-chart.legend.more' | translate | async }}</span>\n </div>\n\n <!-- ----- Sign-in summaries for the visible heatmap window ----- -->\n <dl class=\"__stats\">\n <div class=\"__stat\">\n <dd>{{ formatCount(stats().total) }}</dd>\n <dt>{{ '@auth:profile-page.components.activity-chart.stats.total' | translate | async }}</dt>\n </div>\n <div class=\"__stat\">\n <dd>{{ stats().longestStreak }}</dd>\n <dt>\n @if (stats().longestStreak === 1) {\n <!-- ----- Singular streak unit ----- -->\n {{ '@auth:profile-page.components.activity-chart.stats.day-streak' | translate | async }}\n }\n <!-- ----- Plural streak unit ----- -->\n @else {\n {{ '@auth:profile-page.components.activity-chart.stats.days-streak' | translate | async }}\n }\n </dt>\n </div>\n <div class=\"__stat\">\n <dd>{{ formatCount(stats().avgPerDay) }}</dd>\n <dt>{{ '@auth:profile-page.components.activity-chart.stats.avg-day' | translate | async }}</dt>\n </div>\n <div class=\"__stat\">\n <dd>{{ formatCount(stats().avgPerWeek) }}</dd>\n <dt>{{ '@auth:profile-page.components.activity-chart.stats.avg-week' | translate | async }}</dt>\n </div>\n </dl>\n </footer>\n</div>\n", styles: ["@layer properties;.axm-profile-activity-chart{display:block;width:100%}.axm-profile-activity-chart .__panel{width:100%;border-radius:var(--radius-2xl, 1rem);border-style:var(--tw-border-style);border-width:1px;background-color:var(--color-lightest);color:var(--color-on-lightest);border-color:var(--color-border-lightest);padding:calc(var(--spacing, .25rem) * 6);--tw-shadow: 0 4px 6px -1px var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 2px 4px -2px 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);border-color:rgb(var(--ax-sys-color-border-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface))}.axm-profile-activity-chart .__header{margin-bottom:calc(var(--spacing, .25rem) * 5);display:flex;align-items:flex-start;justify-content:space-between;gap:calc(var(--spacing, .25rem) * 4)}.axm-profile-activity-chart .__title-row{display:inline-flex;align-items:center;gap:calc(var(--spacing, .25rem) * 2)}.axm-profile-activity-chart .__title{margin:0;font-size:var(--text-lg, 1.125rem);line-height:var(--tw-leading, var(--text-lg--line-height, calc(1.75 / 1.125)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);color:rgb(var(--ax-sys-color-on-lightest-surface))}.axm-profile-activity-chart .__info-icon{opacity:50%;color:rgb(var(--ax-sys-color-on-light-surface))}.axm-profile-activity-chart .__footer{margin-top:calc(var(--spacing, .25rem) * 4);display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;column-gap:calc(var(--spacing, .25rem) * 6);row-gap:calc(var(--spacing, .25rem) * 3);padding-top:calc(var(--spacing, .25rem) * 3);border-top:1px solid rgb(var(--ax-sys-color-border-lightest-surface))}.axm-profile-activity-chart .__stats{margin:0;display:flex;flex-wrap:wrap;align-items:center;column-gap:calc(var(--spacing, .25rem) * 4);row-gap:var(--spacing, .25rem)}.axm-profile-activity-chart .__stat{margin:0;display:inline-flex;align-items:baseline;gap:calc(var(--spacing, .25rem) * 1.5)}.axm-profile-activity-chart .__stat dt{font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));--tw-font-weight: var(--font-weight-normal, 400);font-weight:var(--font-weight-normal, 400);color:rgb(var(--ax-sys-color-on-light-surface))}.axm-profile-activity-chart .__stat dd{margin:0;font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,);color:rgb(var(--ax-sys-color-on-lightest-surface))}.axm-profile-activity-chart .__heatmap-wrap{--week-count: 53;width:100%;overflow-x:auto;padding-bottom:calc(var(--spacing, .25rem) * 2)}.axm-profile-activity-chart .__month-labels{margin-bottom:calc(var(--spacing, .25rem) * 2);display:grid;width:100%;gap:var(--spacing, .25rem);grid-template-columns:1.75rem repeat(var(--week-count, 53),minmax(0,1fr))}.axm-profile-activity-chart .__month-label{font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));color:rgb(var(--ax-sys-color-on-light-surface))}.axm-profile-activity-chart .__heatmap{display:grid;width:100%;gap:calc(var(--spacing, .25rem) * 2);grid-template-columns:1.75rem 1fr;align-items:stretch}.axm-profile-activity-chart .__weekday-labels{display:grid;gap:var(--spacing, .25rem);align-self:stretch;grid-template-rows:repeat(7,1fr)}.axm-profile-activity-chart .__weekday-label{display:flex;align-items:center;font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));color:rgb(var(--ax-sys-color-on-light-surface))}.axm-profile-activity-chart .__grid{display:grid;width:100%;gap:var(--spacing, .25rem);grid-template-rows:repeat(7,auto);grid-auto-flow:column;grid-auto-columns:minmax(0,1fr)}.axm-profile-activity-chart .__cell{width:100%;border-radius:var(--radius-sm, .25rem);aspect-ratio:1}.axm-profile-activity-chart .__cell.--level-0{background:rgb(var(--ax-sys-color-dark-surface))}.axm-profile-activity-chart .__cell.--level-1{background:rgb(var(--ax-sys-color-primary-200))}.axm-profile-activity-chart .__cell.--level-2{background:rgb(var(--ax-sys-color-primary-400))}.axm-profile-activity-chart .__cell.--level-3{background:rgb(var(--ax-sys-color-primary-600))}.axm-profile-activity-chart .__cell.--level-4{background:rgb(var(--ax-sys-color-primary-800))}.axm-profile-activity-chart .__strip{display:grid;width:100%;gap:calc(var(--spacing, .25rem) * 2)}.axm-profile-activity-chart .__strip--days{--day-count: 7;grid-template-columns:repeat(var(--day-count, 7),minmax(0,1fr))}.axm-profile-activity-chart .__strip--hours{grid-template-columns:repeat(24,minmax(0,1fr));gap:.25rem}.axm-profile-activity-chart .__strip-col{display:flex;min-width:0px;flex-direction:column;gap:var(--spacing, .25rem)}.axm-profile-activity-chart .__strip-label{display:block;text-align:center;font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));white-space:nowrap;min-height:1rem;overflow:visible;color:rgb(var(--ax-sys-color-on-light-surface))}.axm-profile-activity-chart .__strip .__cell{width:100%;border-radius:var(--radius-md, .375rem);height:3.5rem;aspect-ratio:auto}.axm-profile-activity-chart .__strip--hours .__cell{height:2.5rem;border-radius:.25rem}.axm-profile-activity-chart .__strip--days.--dense .__cell{height:2.25rem}.axm-profile-activity-chart .__legend{display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * 1.5)}.axm-profile-activity-chart .__legend-label{font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));color:rgb(var(--ax-sys-color-on-light-surface))}.axm-profile-activity-chart .__legend-cell{width:calc(var(--spacing, .25rem) * 3);height:calc(var(--spacing, .25rem) * 3);border-radius:var(--radius-sm, .25rem)}.axm-profile-activity-chart .__legend-cell.--level-0{background:rgb(var(--ax-sys-color-dark-surface))}.axm-profile-activity-chart .__legend-cell.--level-1{background:rgb(var(--ax-sys-color-primary-200))}.axm-profile-activity-chart .__legend-cell.--level-2{background:rgb(var(--ax-sys-color-primary-400))}.axm-profile-activity-chart .__legend-cell.--level-3{background:rgb(var(--ax-sys-color-primary-600))}.axm-profile-activity-chart .__legend-cell.--level-4{background:rgb(var(--ax-sys-color-primary-800))}@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;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@property --tw-ordinal{syntax: \"*\"; inherits: false;}@property --tw-slashed-zero{syntax: \"*\"; inherits: false;}@property --tw-numeric-figure{syntax: \"*\"; inherits: false;}@property --tw-numeric-spacing{syntax: \"*\"; inherits: false;}@property --tw-numeric-fraction{syntax: \"*\"; inherits: false;}@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;--tw-font-weight: initial;--tw-ordinal: initial;--tw-slashed-zero: initial;--tw-numeric-figure: initial;--tw-numeric-spacing: initial;--tw-numeric-fraction: initial}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i3.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "ngmodule", type: AXFormatModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "directive", type: i5.AXTranslatorDirective, selector: "[translate]" }, { kind: "pipe", type: i5$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.AXFormatPipe, name: "format" }, { kind: "pipe", type: i5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
217
217
  }
218
218
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMProfileActivityChartComponent, decorators: [{
219
219
  type: Component,
@@ -226,4 +226,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
226
226
  }], propDecorators: { rootContext: [{ type: i0.Input, args: [{ isSignal: true, alias: "rootContext", required: false }] }], pageConfig: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageConfig", required: false }] }], options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }] } });
227
227
 
228
228
  export { AXMProfileActivityChartComponent };
229
- //# sourceMappingURL=acorex-platform-module-auth-client-profile-activity-chart.component-o7Eq3zuR.mjs.map
229
+ //# sourceMappingURL=acorex-platform-module-auth-client-profile-activity-chart.component-CFaRGMKu.mjs.map